【问题标题】:How do I scrape the OHLC values from this website我如何从这个网站上刮取 OHLC 值
【发布时间】:2019-08-12 15:36:15
【问题描述】:

Website in question。现在我只对最后一个季度进行分析,如果我要扩展到过去的 4-5 个季度,是否有更好的方法来自动化这个任务,而不是通过一次又一次地设置时间范围然后提取来手动完成表值?

我尝试做的事情:

import bs4 as bs
import requests
import lxml
resp = requests.get("http://www.scstrade.com/stockscreening/SS_CompanySnapShotHP.aspx?symbol=HBL")
soup = bs.BeautifulSoup(resp.text, "lxml")
mydivs = soup.findAll("div", {"class": "breadcrumbs"})
print(mydivs)

我得到了什么:

[<div class="breadcrumbs">
<ul>
<li class="breadcrumbs-home">
<a href="#" title="Back To Home">
<i class="fa fa-home"></i>
</a>
</li>
<li>Snapshot   /   <span id="ContentPlaceHolder1_lbl_companyname">HBL - Habib Bank Ltd.</span>   /   Historical Prices
                    </li>
</ul>
</div>, <div class="breadcrumbs" style="background-color:transparent;border-color:transparent;margin-top:20px;">
<ul>
<div class="bootstrap-iso">
<div class="tp-banner-container">
<div class="table-responsive">
<div id="n1">
<table class="table table-bordered table-striped" id="list"><tr><td>Company Wise</td></tr></table>
<div id="pager"></div>
</div>
</div>
</div>
</div>
</ul>
</div>]

检查source,该表位于名为“breadcrumbs”的 div 类中(我通过“inspect element”获得了它),但我没有看到所有值都定义/存储在页面源中的位置。对网络抓取有点陌生,我应该在哪里寻找这些值?

另外一共有 7 页,我目前只是试图从第一个 oage 中刮掉表格,我将如何刮掉我的结果的所有 x 页,然后将它们转换为 pandas 数据框..

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup


    【解决方案1】:

    页面通过 Javascript 从外部源加载数据。通过检查页面发出请求的位置,您可以使用json 模块加载数据。

    您可以调整payload dict 中的参数以获取所需日期范围的数据:

    import json
    import requests
    
    url = 'http://www.scstrade.com/stockscreening/SS_CompanySnapShotHP.aspx/chart'
    payload = {"par":"HBL","date1":"07/13/2019","date2":"08/12/2019","rows":20,"page":1,"sidx":"trading_Date","sord":"desc"}
    
    json_data = requests.post(url, json=payload).json()
    print(json.dumps(json_data, indent=4))
    

    打印:

    {
        "d": [
            {
                "trading_Date": "/Date(1565290800000)/",
                "trading_open": 111.5,
                "trading_high": 113.24,
                "trading_low": 105.5,
                "trading_close": 106.17,
                "trading_vol": 1349000,
                "trading_change": -4.71
            },
            {
                "trading_Date": "/Date(1565204400000)/",
                "trading_open": 113.94,
                "trading_high": 115.0,
                "trading_low": 110.0,
                "trading_close": 110.88,
                "trading_vol": 1122200,
                "trading_change": -3.48
            },
    
        ... and so on.
    

    编辑:

    我通过查看 Firefox 开发人员工具中的“网络”选项卡找到了页面加载数据的 URL:

    有 URL,页面如何发出请求的方法(在这种情况下为 POST)和所需的参数:

    我复制这个URL和参数,在requests.post()方法中使用获取json数据。

    【讨论】:

    • 能否请您编辑您的帖子并更详细地解释您的代码在做什么?我在肤浅的层面上理解它,但我认为我自己目前无法编写这样的东西,为什么当我从浏览器的地址栏中转到那个 url 变量时,它会给我一个服务器端错误?而且我不确定您是如何或从哪里获得有效载荷中的所有这些参数的(sord,sidx)
    • @AjwadJaved 我编辑了我的答案并添加了一点解释(带截图)
    • 非常感谢!!最后一个问题:将您的代码给我的输出格式化为熊猫数据框的最佳方法是什么?理想情况下,我们要做的是首先从第一个 {} 创建标头,然后继续获取值(通过搜索第二个“”)并继续将它们扔到我们的数据框中。在此过程中也必须格式化那种丑陋的日期格式,甚至不确定它目前是哪种格式
    • 原来我使用了错误的格式:"date1":"01/01/2019","date2":"01/06/2019" 而不是 "date1":"01/01 /2019","date2":"06/01/2019"。再次感谢所有的人
    • 谢谢。我从没想过 requests.post 可以用来解析数据。我也会看看 selenium,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多