【问题标题】:web scraping table from multiple pages from a search and creating a pandas dataframe通过搜索从多个页面中抓取表格并创建熊猫数据框
【发布时间】:2018-12-03 11:13:29
【问题描述】:

我让这个代码在第一页上工作,并且需要用户代理,否则它不起作用。

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

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

【问题讨论】:

    标签: python pandas web-scraping beautifulsoup urllib


    【解决方案1】:

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

    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) 替换为船舶名称。

    如果它对你有用,我很乐意用漂亮的绿色复选标记来提升我的声誉。

    【讨论】:

    • 在上面编辑。我是个白痴。 page= 和 {} ssooooo 之间有一个空格,显然不会返回任何内容。现在已经修好了。这将从所有页面中提取所有表格
    • 这很有效,仅供参考,这少量的代码击败了一半的网络抓取方法,并且在数据捕获方面比大多数更先进
    • 一件事我怎样才能以简单的方式连接页面
    • 这是给你的熊猫。它在网站上的表格做得非常好,但如果它有更多的功能,那就不知道了。我会查找熊猫连接。我知道上面有大量的文档,应该这样做......或者可能迭代并从所有表中制作一个 pandas df?你必须过期
    • 另外,如果代码解决了您发布的关于您应该标记的问题,那么人们在滚动浏览时就知道解决方案在哪里。
    【解决方案2】:
    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]
    

    您可以浏览您正在寻找的网址并应用它,然后如果您想对表格做一些事情,您可以去:

    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)
    

    【讨论】:

    • 我很困惑,您希望我在我的代码中的哪个位置插入这个以及到目前为止我删除了什么,我添加了第一个受访者? ` url_list = ["vesselfinder.com/vessels?page={}&minDW=20000&maxDW=300000&type=4".format(page_number) for page_number in list(range(1, 953))] for url in url_list: hdr = {'User-Agent': 'Chrome/70.0.3538.110'} req = Request(url,headers=hdr) page = urlopen(req) `
    • 我复制并粘贴了 Pandas 可以替换的代码部分。这是我评论中的第一件事。另外,不知道上面评论中的 url_list 部分与什么有关。
    • 但是我从哪里获取 url 列表,因为如果我遵循代码,因为它已经在代码的第一部分之后的单个页面上,即使遵循下面的海报,我也不会得到它们跨度>
    • 它可以是一个 url 列表,或者您可以将相同的内容应用到一个 URL。世界是你的牡蛎。上面的代码是建议,结合 pieca 似乎是一个解决方案。我会在上面编辑
    • 谢谢,虽然我必须合并标题,因为如果没有此代码上的“用户代理”,网站将不会响应
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 2020-10-31
    • 2022-11-24
    • 2019-04-02
    • 1970-01-01
    • 2018-05-16
    • 2015-03-22
    • 2023-01-14
    相关资源
    最近更新 更多