今天展示一下抓取好买https://www.howbuy.com/fund/001605/左上角的重仓持股数据。要获取的数据如下图:
通过浏览器的开发工具我们可以找到除了日增幅以外的数据都放在下面的url里面,就在定义的变量gpzhListData这一部分。https://static.howbuy.com/??/upload/auto/script/fund/jzzs_001605.js,/upload/auto/script/fund/jjjl_001605.js,/upload/auto/script/fund/data_001605.js?v=8542516。有趣的是这里面包含了证券代码而没有日增幅的数据,那么日增幅的数据是怎么获得的?其实是通过这里的证券代码(zqdm)去访问接口https://www.howbuy.com/fund/ajax/gmfund/stock/stockvalue.htm?stockCode=来获得。stockCode后面以逗号连接多个张券代码,可以返回一个json数据。类似于下面图片:
这里提一下,在处理json数据网页时候,我们经常会遇到属性名没有用双引号号。这样导致在使用json模块加载的时候失败,这里推荐一下使用demjson.可以处理这种无法识别的问题。用法也蛮简单的。如下:
另外一个在模拟浏览器的字符串我建议使用fake_useragent,这样节省不少字符长度。我下面选择的是chrome.你可以选择ua.ie,ua.random,ua.firefox.如下图。
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 1 14:48:51 2018
@author: FanXiaoLei
"""
import requests
from fake_useragent import UserAgent
import demjson
from prettytable import PrettyTable
url='https://static.howbuy.com/??/upload/auto/script/fund/jzzs_001605.js,/upload/auto/script/fund/jjjl_001605.js,/upload/auto/script/fund/data_001605.js?v=8542516'
ua=UserAgent()
headers={'User-Agent':ua.chrome}
r=requests.get(url,headers=headers)
s=r.text.split('gpzhListData = ')[1].split(';\r\nhyPieData')[0]
data=demjson.decode(s)
date=data['lastDate']
newdata=data[date]
hdr=['序号','股票简称','日涨幅','占净资产比','持股变动(万股)']
mytable=PrettyTable(field_names=hdr)
i=0
url2='https://www.howbuy.com/fund/ajax/gmfund/stock/stockvalue.htm?stockCode='
stockCode=','.join([L['zqdm'] for L in newdata])
req=requests.get(url2+stockCode,headers=headers)
d=demjson.decode(req.text)
for m in newdata:
row=[]
i+=1
row.append(i)
if m['zqdm'] in d:
daygrow='%.2f%%'%(float(d[m['zqdm']]['valuation'])*100)
else:
daygrow='--'
row=row+[m['zqmc'],daygrow,'%.2f%%'%m['zjbl'],'%.2f'%(m['ccdb']/10000)]
mytable.add_row(row)
print(mytable)
运行结果如下