距离上次发这个贴子已经过去了半年了,期间又在之前的基础上完善细化了多版,可能比下面介绍的又多了些功能,如果要看新的成品的演示和获取软件程序,这里就总结在开头,如果想看细节,请直接下滑:
股票行情、基本面、财报、历史数据批量下载器:https://www.bilibili.com/video/BV12T4y1h7Fd/
股票资金流向历史分时资金下载器:https://www.bilibili.com/video/BV1ma411v7FM/
股票国家队持股下载器:https://www.bilibili.com/video/BV1E541117ei/
股票历史分价表下载器:https://www.bilibili.com/video/BV1cu411r7qp/
股票高频Tick历史数据下载器:https://www.bilibili.com/video/BV16g411S7nU/
股票历史市盈率下载器:https://www.bilibili.com/video/BV1fr4y1u7kY/
期货期权行情及历史数据下载器:https://www.bilibili.com/video/BV1sS4y1C7GU/
期货成交持仓龙虎榜下载器:https://www.bilibili.com/video/BV1ES4y1h7mk/
——————分割线20220917——————
最初诞生VBA网抓的想法,还是因为自己炒股想要更快速获取信息,又不想买费用高昂的券商软件。后来调查发现,其实Python才是最出名的爬虫制作工具,但是要安装环境,最后做出来又只能在自己电脑上用,通用性不太强,所以就把目光对准了使用Excel或者VBA网抓。
(一)使用Excel自带的Power Query获取网页表格
如果一个方法能解决现有需求,说实话,我是没有动力去找第二个方法的。在使用VBA网抓之前,我就已经开始使用Excel的Poewr Query在做股票信息分析,最开始用的Power Query的“新建查询”功能,从网页获取表格数据(具体方法可以参考:https://finance.sina.com.cn/tech/2021-05-06/doc-ikmyaawc3588981.shtml),可以直接更新到Excel表格中。数据源当时选取的是中财网数据引擎(https://data.cfi.cn/cfidata.aspx),不得不说这个网站真的对使用Excel自动网页数据源获取真的非常友好,因为都是可以识别的表格形式数据。更新Excel后是这个样子。之后利用简单学习的Power Query操作就可以快速清洗并分析处理大量数据。
然而,后来其实发现了这个方法的局限性,就是对数据源要求太高了,很多网站的表格数据,用Excel导入网站数据源的形式识别不了,而且我想要的股票或者期货历史数据,也不在这个网站中。并且Power Query这个方法,WPS是不支持的。这样无奈最后放弃了这个思路,开始探索真正的VBA网抓实现方法。
(二)Excel VBA 实现期货行情获取及历史数据下载
第一步,选择数据源。如果是用Python网抓,其实数据源是非常好找的,网上很多都是为Python开放的接口,开发者甚至都不需要找源网页,直接用各种接口提供的现成的结构化数据就可以,连数据处理的步骤都省略了。然而,毕竟还有很多人像我一样,电脑上没有Python,电脑上更不会去安装Python库(这些现成的接口都需要在电脑上安装Python库),或者说不希望看到换了电脑软件就用不了的情况,所以数据源还是选择通用一点的。经过调研中国的期货市场情况后,发现其实获取数据只要从四大交易所(郑州、大连、上海、中国金融期货交易所)官网获取就可以了,这些网站都提供有下载链接和一键下载的功能。然而,在后续分析html请求和响应的时候,最让我这个强迫症患者接受不了的情况发生了,四个交易所里面,三个可以抓,一个有反爬虫抓不了。。。这样还得再找其余的接口,不行,接受不了!后来发现,新浪接口真是个宝贝,四个交易所都包括了,好的就决定分析这个网页,然后抓取,成功!附新浪接口链接(需要自行分析这个网页,找到适用的名称规则并简化):
实时行情:http://vip.stock.finance.sina.com.cn/quotes_service/view/qihuohangqing.html#titlePos_1
历史数据:https://vip.stock.finance.sina.com.cn/q/view/vFutures_History.php?jys=czce&pz=AP&hy=AP0&breed=AP0&type=inner&start=2021-11-23&end=2021-12-23
第二步,代码实现。VBA网抓入门可以参考B站的一位UP主发布的免费教程(链接https://www.bilibili.com/video/BV1uJ411t7hY/)在这次抓取期货时,先分析的新浪财经的网页,发现这个接口并不复杂,可以直接用Winhttp请求,然后用正则表达式处理返回数据即可。核心代码如下:
发送请求部分
正则表达式匹配及写入数组部分
需要注意的是,在更新产品行情时,产品的名称网抓返回的是unicode码,所以还需要额外将其转为汉字,这部分编写了一个自定义函数,代码如下:
网抓的部分还有一个需要注意的就是对返回json格式数据的处理。其实VBA可以引用script组件,实现对json数据的快捷方便的解析,而且引用此类组件解析json,自动会实现unicode转汉字。但是此类方法测试中wps运行正常,但是有的excel会报错,说是缺少ActiveX控件的429错误,这个就不好解决了。一般这类错误不是excel版本导致的,大概率是没有完整安装,或者同时安装wps及office导致某些系统组件注册失败。这种错误通过修改代码解决不了(除非更改代码逻辑,不调用其余组件),是系统的问题,例如注册表项受损、操作系统的文件被删除、安装了不完整的excel、系统文件受损等。所以最后为了增加兼容性,避免此类错误,又重新修改了代码,不用script组件解析json,而是用正则表达式。
网抓后,简单写一些数据处理的函数公式,以及设计了两种存储模式(存储到当前工作簿,或新建工作簿),这样软件功能就算是完整了。计算日期的时候,excel自带的workday函数非常好用。
第三步,交互窗体。最后设计了一个用于数据输入的交互窗体,代码的话主要就是用到了inputbox方法,核心代码及界面如下:
软件地址:https://item.taobao.com/item.htm?ft=t&id=664624608973
用类似的方法实现股票信息获取的教程,可以参考我的另一篇文章以股票历史数据抓取为例,浅谈踩过的VBA网抓的“坑” - 知乎