我在第一页上使用了此代码,并需要用户代理,否则无法正常工作。
我遇到的问题是搜索带来了第一页,但是在第二个页面上,您有了“ 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)
输出是一个熊猫数据框
需要抓取所有页面以输出较大的数据框
答案 0 :(得分:0)
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'
请注意,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)
答案 1 :(得分:0)
好的,所以这个问题最终卡在了我的头上,所以我解决了。
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)
它将返回第一列(容器)作为nan值。这是图像的列,如果不需要,请忽略它。 下一列称为“建造”,其中包含船只名称和船只类型。您需要先使用.split()分隔它们,然后才能用船名替换column(vessel)。
如果它对您有用,我希望通过一个漂亮的绿色复选标记来提高我的声誉。