通过搜索从多个页面抓取 table 并创建 pandas 数据框

web scraping table from multiple pages from a search and creating a pandas dataframe

我在第一页上使用了这段代码,并且需要用户代理,否则它无法正常工作。

我遇到的问题是搜索带来第一页,但在第二页你有 "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

需要抓取所有页面以输出大数据帧

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 并应用它,然后如果您想做某事 with/to 您可以直接访问这些表:

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

请注意,table_dfs 的内嵌 for 循环在一个列表中。这意味着如果刮擦足够大,您可能无法辨别它来自哪个 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)

好的,所以这个问题最终卡在了我的脑海里,所以我解决了。

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)

它将return第一列(vessel)作为一个nan值。那是图像的列,如果你不需要它,请忽略它。 下一列将称为 'built',其中包含船舶名称和船舶类型。您需要 .split() 将它们分开,然后您可以将 column(vessel) 替换为船名。

如果它适合你,我很乐意用一个漂亮的绿色复选标记来提高我的声誉。