这一篇是对我之前股票和期货网抓的补充,如对股票和期货抓取感兴趣,可以参考我的上篇文章:用Excel实现自动获取期货、期权、股票行情及下载历史数据 - 知乎。在做完股票和期货的网抓后,感觉基金也可以一试,便将制作过程写在这篇文章中,供参考。
先看结果,这个是做好的演示视频和样本数据:
基金样本数据链接:https://pan.baidu.com/s/1T0I524wQ3TsnJVZoHm42EQ
提取码:1234
基金数据下载器演示视频:https://www.bilibili.com/video/BV1Wq4y1876P/
第一步,选择数据源。基金方面,经过前期收集资料,发现“天天基金”网数据比较全(可以获得实时行情和历史数据),能满足基本需求,而且网上其余的抓取好像都是在用天天基金的数据源,所以也打算使用天天基金作为抓取数据源。
经初步浏览天天基金的网站,发现大概可以值得抓取的有这么几项,分别附上接口(以代码000001基金为例):
实时行情:http://fund.eastmoney.com/000001.html
新成立基金:https://fund.eastmoney.com/data/FundNewIssue.aspx?t=xcln&sort=jzrgq,desc&y=&page=1,20000
所有股票清单:https://fund.eastmoney.com/js/fundcode_search.js
其中,后三者的接口是通过都是分析请求得来的,返回的都是纯文本html数据,只有第一个实时行情是正常的网页,采用的方法是返回网页源代码然后用正则表达式匹配。
第二步,代码实现。因为抓取的数据源只有一个(天天基金网),而且返回的也是比较干净的数据,因此网抓部分的代码实现并不复杂。但是在抓取的时候,发现天天基金网的内部使用的应该是UTF-8编码,一开始使用更新的Winhttp对象抓取时,发现所有中文汉字字符抓取后返回的数据都变为了???(乱码),之后搜索各种解码方案,无效。最后无意间发现使用较老的xmlhttp对象发送请求,可以返回正常的中文,这个是没想到的。可能winhttp对象在使用时还会有一些转码的问题吧。
核心部分代码(网抓+正则表达式)如下:
此外,与之前的网抓不同的是,基金的网抓中涉及到翻页获取数据的情况(如下图)。目前采用的方案就是通过for循环的嵌套实现,在外层for循环中首先使用一次请求及正则表达式匹配,获取每类基金数据的总页数。之后内层循环再从不同页之间循环访问。
第三步,数据处理及交互界面。交互界面的设计相对简单,沿用了之前的方案,这里不细说。但是基金这部分的数据处理确实值得讲一下。一是在抓取阶段的判断,使用If语句判断基金类型,因为货币型基金是比较特殊的,没有净值的概念,取而代之的是每万份收益。因此抓取时所用的正则表达式也是不一样的。二是获取到了数据后,由于数据源对于货币型基金并没有“日增长率”的数据,因此需要将相关部分写为“无”。三是为数据设计了两种存储方式(在当前工作簿以及新建工作簿)。因为条件和循环比较多,所以涉及到大量的for以及if嵌套,建议一定要写好注释,并做好代码的缩进,不然看起来会非常困难。