量化投资从0开始系列 ---- 9. 网络爬虫

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个概念:

数据没有问题,完成。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blkq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值