Tushare的申万行业分类接口需要2000分才能调用,分不够怎么办?自己写个爬虫吧。
网上搜了一下,找到一个有对应数据的财经网站,就从这里爬取吧。
先随便点一下翻页按钮,可以看出网页每次都有部分刷新,说明是ajax方式请求数据。
按F12打开firefox浏览器的调试窗口,在“网络”页面上,查看XHR类型的请求。按数据大小排序:
可以看到最上面两个请求的响应中都包含了期望的数据:
仔细观察不难发现,第一个请求是第一次渲染表格时的后台请求,第二个请求是翻页时的后台请求。比较一下两个请求提交的字段和请求头的复杂程度,明显getDataList更友好,就用这个接口好了。
python代码要引入requests这个modue,用来发送http请求:
def _get_data_list(self, page=1, per_page=default_per_page):
iwencai_url = f'http://{web_site_url}/urp/v7/landing/getDataList?query=%E7%94%B3%E4%B8%87%E8%A1%8C%E4%B8%9A&page={page}&perpage={per_page}&comp_id={comp_id}&uuid={uuid}'
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:89.0) Gecko/20100101 Firefox/89.0',
'Accept': '*/*',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded',
'Origin': 'http://{web_site_url}'
}
r = requests.post(iwencai_url, headers=headers)
return r.content.decode()
然后解析并保存到数据库:
def _full(self, **kwargs):
df = pd.DataFrame(
columns=['ts_code', 'name', 'sw1', 'sw2', 'sw3'])
json_value = json.loads(self._get_data_list())
data = json_value['answer']['components'][0]['data']['datas']
row_count = json_value['answer']['components'][0]['data']['meta']['extra']['row_count']
for i in range(1, row_count, default_per_page):
for record in data:
if record['所属申万行业'] is not None:
sws = record['所属申万行业'].split('--')
else:
sws = ['', '', '']
df = df.append(
[{'ts_code': record['股票代码'], 'name': record['股票简称'], 'sw1': sws[0], 'sw2': sws[1], 'sw3': sws[2]}],
ignore_index=True)
page = math.floor(i / default_per_page) + 2
json_value = json.loads(self._get_data_list(page))
data = json_value['answer']['components'][0]['data']['datas']
return df
最终查看数据库:
同理,稍加改动,可以把所有的概念股明细也取回来,查看一下结果:
概念最多的一只股票是苏宁易购,关联了51个概念:
数据没有问题,完成。