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”获得了该东西),但是我看不到在页面中定义/存储所有值的地方资源。 Kinda是Web抓取的新手,我应该在哪里寻找这些值?
总共有7页,我目前只是想从第一个oage刮掉桌子,我将如何刮掉结果的所有x页,然后将它们转换为pandas数据框。 >
答案 0 :(得分:1)
该页面通过Java脚本从外部源加载数据。通过检查页面在哪里发出请求,可以使用json
模块加载数据。
您可以调整payload
字典中的参数以获取所需日期范围的数据:
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,页面如何发出请求的方法(在这种情况下为POST)和所需的参数:
我复制此URL和参数,并在requests.post()
方法中使用它来获取json数据。