最近有盆友需要帮忙写个爬虫脚本,爬取雪球网一些上市公司的财务数据。盆友希望可以根据他自己的选择进行自由的抓取,所以简单给一份脚本交给盆友,盆友还需要自己搭建python环境,更需要去熟悉一些参数修改的操作,想来也是太麻烦了。
于是,结合之前做过的汇率计算器小工具,我这边决定使用PyQt5给朋友制作一个爬虫小工具,方便他的操作可视化。
首先引入需要的库
这一步的目的是获取需要爬取的数据的真正URL地址规律。
当我选中某只股票查看财务数据某类型数据报告时,点击下一页,网站地址没有变化,基本可以知道这是动态加载的数据,对于这类数据可以使用F12打开开发者模式。
在开发者模式下,选到Network—>XHR可以查看到真正的数据获取地址URL及请求方式(General里是请求URL和请求方式说明,Request Headers有请求头信息,如cookie,Query String Parameters就是可变参数项,一般来说数据源URL就是由基础URL和这里的可变参数组合而成)
我们分析这段URL,可以发现其基本结构如下:
基于上述结构,我们拆分最终的组合URL地址如下
操作界面设计使用的是PyQt5,这里不做更详细的介绍,我们在后续中对PyQt5的使用再专题讲解。
使用QT designer对操作界面进行可视化设计,参考如下:
.ui文件可以使用pyuic5指令进行编译生成对应的.py文件,或者我们也可以在vscode里直接转译(这里也不做更详细的介绍,具体见后续专题讲解)。
本文没有将操作界面定义文件单独使用,而是将全部代码集中在同一个.py文件,因此其转译后的代码备用即可。
为了便于小工具拿来即可使用,我们需要自动获取cookie地址并附加在请求头中,而不是人为打开网页在开发者模式下获取cookie后填入。
自动获取cookie,这里使用到的requests库的session会话对象。
requests库的session会话对象可以跨请求保持某些参数,简单来说,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象请求该网站的其他网页都会默认使用该session之前使用的cookie等参数
基础参数是用于财务数据请求时原始网址构成参数选择,我们在可视化操作工具中需要对财务数据类型进行选择,因此这里需要构建财务数据类型字典。
因为我们在可视化操作工具上是选定股票代码后抓取相关数据并导出,对导出的文件名称希望是以股票代码+公司名称的形式(SH600000 浦发银行)存储,所以我们需要获取股票代码及名称对应关系的字典表。
这其实就是一个简单的网络爬虫及数据格式调整的过程,实现代码如下:
A股股票代码及公司名称字典如下:
由于请求后的数据是json格式,因此可以直接进行转化为dataframe类型,然后进行导出。在数据导出的时候,我们需要判断该数据文件是否存在,如果存在则追加,如果不存在则新建。
通过选定的参数生成财务数据网址,然后根据是否全选决定后续数据请求的操作,因此可以拆分为获取数据网址和请求详情数据两部分。
证券市场类型 控件 是radioButton,可以通过你 ischecked() 方法判断是否选中,然后用if-else进行参数设定;
财务数据类型 和 股票代码 因为支持 全选,需要先进行全选判定(全选条件下是需要循环获取数据网址,否则是单一获取即可),因此这部分需要再做拆分;
单页数量 考虑到每年有4份财务报告,因此这里默认为年份差*4;
需要根据用户输入决定数据采集方式,代码中主要是根据用户输入做判断然后再进行详情数据请求。
上面就是制作过程讲解与关键代码,由于源代码内容较多,就不全量展示了,可在后台回复“XQ”可获取完整源代码文件!