爬虫爬出来的数据不全_Excel VBA爬虫的债市小试

df9eda847465823133f693d3a21cdb55.png

说到爬虫,大家第一个想到的语言可能就是Python。Python的爬虫应该也是现在最火的技术,很多人最开始学Python就是为了爬虫。之前看过有大佬写的用Python爬取一些债券网站的信息,自己也仿照着做了一做。

做的过程中,我想,有些输入参数是从Excel中来的,用Python爬完之后又要存入Excel中进行处理,而且并不是每个人电脑里都装了Python环境,但是每个人都有Excel,要是能用VBA做爬虫就好了。然后我就搜了一下,没想到还真有VBA爬虫的办法(VBA虽然难用,但是基本该有的还是都有的)。

VBA爬虫的基础知识:VBA与网抓

我做的是抓取某只债券某日的中债登借券余额。具体意义和原理请大家移步“固收小黄”的Python爬虫的债市小试,就不再赘述了。感谢“固收小黄”。

VBA代码如下:(吐槽一下Markdown貌似不支持VBA语法,所以只能选了http://VB.net,使得下面有些地方看起来怪怪的)

Function jdye(bondID As String, d As Date) As Double

URL = "https://www.chinabond.com.cn/jsp/include/EJB/jdtj_dzzq.jsp?sel4=1&tbSelYear6=" & _
        Year(d) & "&tbSelMonth6=" & _
        Month(d) & "&calSelectedDate6=" & _
        Day(d) & _
        "&ZQFXRJD1=00&FUXFSJD1=00&JXFSJD2=00&JDQX2=00&ZQFXRJD3=00&ZQFXRJD4=00&I_ZQDM_JD=" & _
        bondID

Set oHttp = CreateObject("MSXML2.XMLHTTP") '创建一个xmlhttp对象
Set oDom = CreateObject("htmlfile") '创建一个Dom对象

'XmlHttp对象(MSXML2.XMLHTTP)向http服务器发送请求并使用微软XML文档对象模型Microsoft? XML Document Object Model (DOM)处理回应。

With oHttp
    .Open "GET", URL, False '使用Open方法,创建一个新的http请求,用get请求,False代表非异步加载
    .send '将open方法的信息发送给网页服务器
     oDom.body.innerHtml = .responseText '将响应网页的HTML赋值给Dom对象,并只需要body标签里面的内容
End With

For Each Item In oDom.all
  If Item.tagname = "TD" And Item.innertext = bondID Then
    jdye = Item.NextSibling.innertext '借贷余额
    'Item.NextSibling.NextSibling.innertext '债券存量
    'Item.NextSibling.NextSibling.NextSibling.innertext '借贷余额/债券存量
    Exit For
  End If
Next
End Function

在这里我写了一个Function,就是为了更好地跟Excel表格结合。Excel是一个天然而且强大的GUI,这也是为什么我想在Excel上做爬虫的原因。

但是Function很难调试,所以我一般会先写一个Sub,最后再换上Function的外壳。写Sub调试的时候,别忘了打开“本地窗口”,不然真的是两眼一抹黑。

8ed2276daa27494d38cbab8546ce64b1.png

调试好之后,包装成Function就好了,这个函数有两个参数,=jdye(债券代码, 日期)。然后在表格中写好日期和债券代码,完全可以按照自己想要的布局设置。最后把公式写上,再拖动一下,数据就会一点一点爬出来啦

0a3a729aac4515513f7e94bd4557cdd5.png

下面是动图。看起来有点卡顿,放心不是你手机或电脑的问题,是我的问题。爬虫确实会慢一些,可能跟网络有关,大概一条数据要2-3秒吧,所以建议平常在公式选项卡里面把计算选项设置为手动,或者把爬过的历史数据粘贴为数值。不然如果触发表格的重算,就会重新爬一遍,造成不必要的卡顿。而且爬多了万一被盯上了也不好呀XD

a447d797aea2f97aaf1933a67490d120.gif

像这样只在一个网页里面直接取一两个数的,可以尝试用vba做,但如果要取的数据很多,还要进行一些数据处理的,恐怕还是用Python更好一些。

感谢阅读,有关于债券和VBA、Python的想法,欢迎交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值