示例展示通过VBA获取页面http://stock.n8n8.cn/flows?zjlx=110,总共63页数据。我仅展示抓取2页数据。通过浏览器的开发工具获得数据源的页面地址为下图中的Request URL:
通过鼠标翻页多次网址比较我们会发现url里面的begin参数就是控制页面的。0表示第1页,依次递增。r是一个随机数。我们可以通过rnd()函数生成。翻页通过循环修改url中的begin参数值就可以实现。那么我们抓取页面的内容就很容易了。
我们发现数据源是json格式,如下图所示,显示的是unicode编码字符,不用担心,后面scriptcontrol会自动解码转为我们日常所见的正常字符:
vba代码如下:
Sub test()
Dim Sc As Object, url As String, i As Integer, json As String, js As String
Set Sc = CreateObject("scriptcontrol")
Sc.Language = "javascript"
ActiveSheet.UsedRange.Clear
[A1:M1] = [{"代码","名称","最新价","涨幅","成交额","换手率","主力净买","跟风净买","散户净买","↑资金净买","5日主力","10日主力","20日主力"}]
With CreateObject("Msxml2.XMLHTTP")
For i = 0 To 1
Randomize
url = "http://stock.n8n8.cn/index.php?m=data&c=index&a=getZjlx&begin=" & i & "&amount=40&bAsc=0&board=1&sortType=110&r=" & Rnd()
.Open "GET", url, False
.send
Do
DoEvents
Loop Until .Status = 200 And .readyState = 4
json = .responsetext
With Sc
.addObject "rng", Cells(Rows.Count, 1).End(3)(2)
js = "var js=" & json & ",a=js.response,b=a.bodRptArray,row=1;for(i in b){r=row++;rng(r,1)=b[i].code;rng(r,2)=b[i].name;jj=b[i].values;col=3;for (k in jj){rng(r,col++)=jj[k];}}"
.eval (js)
.Reset
End With
Next
End With
Set Sc = Nothing
End Sub
结果部分数据展示如下面的图片,我翻了2页的数据刚好80条,检查了一下首位的数据,也符合预期:
实现代码如上。微软的scriptcontrol只能适用于32位的office。64位的office可以使用微软的microsoft html object library实现同样的。当然还有支持64位的第三方的scriptcontrol控件,下载地址:https://tablacus.github.io/scriptcontrol_en.html,用法同官方的scriptcontrol一样,下载的地址里有示例的展示。