想不到VBA也可以爬取网页,说实在话,我也不知道。今天我结合搜索的一些资料和探索,对VBA爬取网页的2种实现方式做一个全方位和细节解释,相信看完这篇文章的小伙伴会对VBA爬取网页有一个了解和认知,而且我觉得已经够用了,因为Python在爬取网页方面完胜VBA,甚至其他编程语言,所以如果真想爬取网页,还是用Python吧。
第一种方法使用Webbrowser控件
相当于在Office里打开一个看得见的IE。优点是实现简单,易于调试,整个抓取过程直观可视,易于解决动态网页、跨域登录等棘手问题。结合excel爬取网页表格内容超级好用。缺点是不灵活,有些网页处理不了,同时如果内容较多,速度很慢。最大的缺点就是需要IE浏览器。
首先在excel新建一个Active X控件,然后基于控件编写VBA代码。
Private Sub CommandButton1_Click()
Dim tb, H%, j%
On Error Resume Next
With CreateObject("internetexplorer.application")
.Visible = True
.Navigate "https://www.usd-cny.com/jiaotong.htm"
Do Until .ReadyState = 4
DoEvents
Loop
Set tb = .document.All.tags("table")(0).Rows
For H = 0 To tb.Length - 1 'row
For j = 0 To tb(H).Cells.Length - 1 'cols
Cells(H + 1, j + 1) = tb(H).Cells(j).innerText
Next j
Next H
End With
End Sub
解释一下"Set tb = .document.All.tags("table")(0).Rows",获取所有table元素,同时括号的0代表数组元素第0个,后边的内容其实是对数组元素的处理。
第二种方法是使用XMLhttp对象
优点是速度快,灵活,可以实现GET、POST、Header、Cookie等诸多细节。缺点是比Webbrowser麻烦一点,调试不直观。
查看网页源代码,抓取的是下面的文本
Sub 抓取当天天气()
'创建对象
Dim xmlHttp As Object
Set xmlHttp = CreateObject("MSXML2.XMLHTTP")
'发送请求
xmlHttp.Open "GET", "https://www.weaoo.com/suzhou-taicangshi-795.html", False
xmlHttp.send
'等待响应
Do While xmlHttp.ReadyState <> 4
DoEvents
Loop
'得到请求数据
Dim Myhtml As String
Myhtml = xmlHttp.responseText
Dim weather As String
weather = Split(Split(Myhtml, "")(1), "
")(0)
Rem Range("G2") = "天气:" & weather
MsgBox ("今日天气更新已完成,今日天气为:" & weather)
End Sub
重点解释一下split用法,weather = Split(Split(Myhtml, "")(1), "
")(0)
在VBA中split用法如下:
描述
返回一个下标从零开始的一维数组,它包含指定数目的子字符串
语法
Split(expression[, delimiter[, limit[, compare]]])
参数说明
-1
,则返回所有子字符串。在此次代码段的用法,经验证,目前只能实现两个split套用,而且只能对两段间隔字符串的内容进行提取,如果要使用多段内容,目前也只能采用提取内容后,再进行字符串组合的方式。
总结
对于VBA爬取网页,建议小伙伴们仅限了解,不需要过多深入浪费时间学习,真心觉得用处不大。