通过搜索从多个页面抓取 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) 替换为船名。
如果它适合你,我很乐意用一个漂亮的绿色复选标记来提高我的声誉。
我在第一页上使用了这段代码,并且需要用户代理,否则它无法正常工作。
我遇到的问题是搜索带来第一页,但在第二页你有 "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) 替换为船名。
如果它适合你,我很乐意用一个漂亮的绿色复选标记来提高我的声誉。