веб-таблица соскобления с нескольких страниц из поиска и создания кадра данных pandas - PullRequest
0 голосов
/ 03 декабря 2018

Я получил этот код, работающий для первой страницы, и мне понадобился пользовательский агент, так как иначе он не работал.

Проблема, которую я получаю, заключается в том, что поиск приводит к первой странице, а на второй - "page = 2 "и продолжаем, поэтому нужно вычистить все или столько, сколько нужно из поиска

" https://www.vesselfinder.com/vessels?page=2&minDW=20000&maxDW=300000&type=4"

from bs4 import BeautifulSoup
from urllib.request import Request, urlopen

site= "https://www.vesselfinder.com/vessels?type=4&minDW=20000&maxDW=300000"
hdr = {'User-Agent': 'Chrome/70.0.3538.110'}
req = Request(site,headers=hdr)
page = urlopen(req) 

import pandas as pd
import numpy as np


soup = BeautifulSoup(page, 'lxml')
type(soup)

rows = soup.find_all('tr')
print(rows[:10])

for row in rows:
   row_td = row.find_all('td')
print(row_td)
type(row_td)

str_cells = str(row_td)
cleantext = BeautifulSoup(str_cells, "lxml").get_text()
print(cleantext)

import re

 list_rows = []
      for row in rows:
         cells = row.find_all('td')
         str_cells = str(cells)
         clean = re.compile('<.*?>')
         clean2 = (re.sub(clean, '',str_cells))
         list_rows.append(clean2)
   print(clean2)
   type(clean2)

df = pd.DataFrame(list_rows)
df.head(10)

df1 = df[0].str.split(',', expand=True)
df1.head(10)

Вывод - Pandas DataFrame

потребностьочистить все страницы для вывода большого кадра данных

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Хорошо, эта проблема закончилась тем, что я застрял в моей голове, и я решил ее.

import pandas as pd
import requests

hdr={'User-Agent':'Chrome/70.0.3538.110'}

table_dfs={}

for page_number in range(951):
    http= "https://www.vesselfinder.com/vessels?page={}&minDW=20000&maxDW=300000&type=4".format(page_number+1)

    url= requests.get(http,headers=hdr)
    table_dfs[page_number]= pd.read_html(url.text)

она вернет первый столбец (сосуд) в виде значения нан.Это столбец для изображения, игнорируйте его, если он вам не нужен.следующий столбец будет называться «построенный», в нем будут указаны название корабля и тип корабля.Вам нужно будет .split (), чтобы разделить их, а затем вы можете заменить столбец (судно) на название корабля.

Если это сработает для вас, я бы хотел улучшить свою репутацию с хорошим зеленымгалочка.

0 голосов
/ 03 декабря 2018
rows = soup.find_all('tr')
print(rows[:10])

for row in rows:
    row_td = row.find_all('td')
print(row_td)
type(row_td)

^ этот код выше - это то же самое, что и

urls=['some list of urls you want to scrape']
table_dfs= [pd.read_html(url) for url in urls]

, вы можете пролистать искомые URL-адреса и применить их, а затем, если вы хотите что-то сделать с /Таблицы, которые вы можете просто перейти:

for table in table_dfs:
    table + 'the thing you want to do'

Обратите внимание, что встроенный цикл for table_dfs находится в списке.Это означает, что вы не сможете определить, с какого URL он пришел, если очистка достаточно большая. Pieca , похоже, нашел решение, которое можно было бы использовать для итерации URL-адресов веб-сайтов и создания ключа словаря.Обратите внимание, что это решение может применяться не ко всем веб-сайтам.

url_list = {page_number:"https://www.vesselfinder.com/vessels?page= 
{}&minDW=20000&maxDW=300000&type=4".format(page_number) for page_number 
in list(range(1, 953))}

table_dfs={}
for url in range(1,len(url_list)):
    table_dfs[url]= pd.read_html(url_list[url],header=hdr)
...