【问题标题】:Scraping historical data with BeautifulSoup/Pandas - multiple pages使用 BeautifulSoup/Pandas 抓取历史数据 - 多页
【发布时间】:2019-01-27 04:40:48
【问题描述】:

刚开始使用 Python 进行网络抓取,并且在从以下来源获取表格格式的数据时遇到问题:https://www.uzse.uz/trade_results?mkt_id=ALL&date=26.01.2019&search_key=

我能够从单个页面获取“原始”表:

import requests
from bs4 import BeautifulSoup

page = requests.get("https://www.uzse.uz/trade_results?mkt_id=ALL&date=25.01.2019&search_key=")
soup = BeautifulSoup(page.content, 'html.parser')
tbl = soup.find_all(class_= "col-xs-12 table-responsive")
tbl

但是,我们的想法是以表格格式获取过去 2 年中给定日期(多页)的所有交易,以进行进一步的探索性分析。此时我对第二列和第三列中的 URL 不感兴趣,只想保留名称(即 UZ7004510002 KUMZ、AJ)。

如果我正在努力取得进展,我将不胜感激。

【问题讨论】:

    标签: python python-3.x pandas beautifulsoup css-tables


    【解决方案1】:

    这个站点只有一个表,所以我们也可以使用table来解析第一个url的表信息

    page = requests.get("https://www.uzse.uz/trade_results?mkt_id=ALL&date=25.01.2019&search_key=")
    
    soup = BeautifulSoup(page.content, 'html.parser')
    tbl = soup.find('table', attrs={'class': 'table centered-table'}).findAll('td')
    
    
    array = []
    for x in range(0,len(tbl)):
        array.append(tbl[x].text.strip())
    
    print array
    

    这只是这个网址。你想解析过去 2 年的时间,所以它的时间太长了。

    如果您想从底部更改页面。您需要根据底部的li 的数量更改url。

    您可以使用Python Selenium Web Driver 创建一个自动更改日期的机器人,单击按钮并解析数据然后返回结果。

    【讨论】:

    • 感谢您查看此内容。我正在考虑循环访问 URL(上面写着25.01.2019 的部分)来更改日期。但首先我需要弄清楚从多个页面获取单个日期的所有数据......我也无法将输出转换为数据表格式......
    • 给定的url和https://www.uzse.uz/trade_results?date=25.01.2019&mkt_id=ALL&page=1&search_key=是一样的,page=1 可以根据页数一一增加。
    • 是的,但我不知道每个日期的确切页数。这也应该考虑,我猜...
    • 每个页面都有<li class="last next">,并且有一个像/trade_results?date=25.01.2019&mkt_id=ALL&page=12&search_key=这样的href,这个page=12 12是url中的最后一页可以更改每个页面。您需要获取此值并根据需要增加url的页面到这个号码
    【解决方案2】:

    至于将您的输出转换为表格,您当然可以使用 BeautifulSoup 来做到这一点,这没问题,但确实需要一些工作。但是如果我看到有<table> 标签,我的默认设置是使用pandas,因为它会为你完成工作。如果它以合理的方式返回我想要的东西,我会继续这样做,并在需要时稍微操作一下数据框:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    page = requests.get("https://www.uzse.uz/trade_results?mkt_id=ALL&date=25.01.2019&search_key=")
    tables = pd.read_html(page.text)
    table = tables[0]
    

    输出:

    print (table)
                 Время       ...            Объём торгов
    0   25 янв., 15:02       ...            UZS  421 080
    1   25 янв., 15:02       ...            UZS  261 360
    2   25 янв., 15:02       ...            UZS  682 440
    3   25 янв., 15:02       ...                 UZS  27
    4   25 янв., 15:02       ...         UZS  15 152 000
    5   25 янв., 15:02       ...         UZS  13 500 000
    6   25 янв., 15:02       ...          UZS  2 008 245
    7   25 янв., 15:02       ...             UZS  17 463
    8   25 янв., 15:02       ...            UZS  582 100
    9   25 янв., 15:02       ...             UZS  11 642
    10  25 янв., 15:02       ...          UZS  6 117 871
    11  25 янв., 15:02       ...            UZS  4 581,9
    12  25 янв., 15:02       ...            UZS  550 000
    13  25 янв., 15:02       ...          UZS  7 232 500
    14  25 янв., 15:02       ...                  UZS  1
    15  25 янв., 14:29       ...             UZS  32 000
    16  25 янв., 14:29       ...              UZS  9 000
    17  25 янв., 14:29       ...          UZS  5 337 000
    18  25 янв., 14:29       ...          UZS  1 098 000
    19  25 янв., 14:26       ...              UZS  122,4
    
    [20 rows x 9 columns]
    

    就像 Omer 所说,只需遍历这些值即可转到不同的页面。

    【讨论】:

    • 您的带有pandas 的版本更符合逻辑且更简单。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2021-02-28
    • 2017-10-15
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 2022-01-04
    • 2018-12-09
    相关资源
    最近更新 更多