excelvba抓取网页数据(百度中搜索关键字:网络爬虫写入当前Excel工作表 )
优采云 发布时间: 2021-09-24 06:08excelvba抓取网页数据(百度中搜索关键字:网络爬虫写入当前Excel工作表
)
在百度中搜索关键词“网络爬虫”,将查询结果前5页的数据写入当前Excel工作表中。示例代码如下。
Sub WebQueryBaiduPN()
Dim strURL As String
Dim objXMLHTTP As Object
Dim objDOM As Object
Dim objTitle As Object
Dim intPageNum As Integer
Dim k As Integer
Set objXMLHTTP = CreateObject("MSXML2.XMLHTTP")
Set objDOM = CreateObject("htmlfile")
Cells.ClearContents
Range("a1:c1") = Array("序号", "标题", "链接")
k = 1
For intPageNum = 0 To 50 Step 10
strURL = "https://www.baidu.com/s?"
strURL = strURL & "wd=网络爬虫"
strURL = strURL & "&pn=" & intPageNum
With objXMLHTTP
.Open "GET", strURL, False
.setRequestHeader "If-Modified-Since", "0"
.send
objDOM.body.innerHTML = .responseText
End With
For Each objTitle In objDOM.getElementsByTagName("h3")
k = k + 1
Cells(k, 1) = k - 1
With objTitle.getElementsByTagName("a")(0)
Cells(k, 2) = .innerText
Cells(k, 3) = .href
End With
Next objTitle
Next intPageNum
Set objXMLHTTP = Nothing
Set objDOM = Nothing
Set objTitle = Nothing
End Sub
第16行代码指定获取百度查询结果的页数。通过手动翻百度网页页面,观察Fiddler软件请求框中【WebForms】界面参数的变化,可以发现参数pn代表查询结果的页码。该参数每增加10,网页每增加10更新一次。
代码第17-22行使用MSXML2.XMLHTTP对象发送请求数据,并将获取到的响应信息写入HTML DOM对象的Body标签中。
第 19 行代码指定了请求头域 If-Modified-Since。由于XSXML2.XMLHTTP对象会优先从Excel或IE缓存中读取数据,因此在刷新互联网浏览器数据但未删除缓存时,无法获取网页的最新数据。
If-Modified-Since 是标准的 HTTP 请求标头。发送HTTP请求时,会将浏览器缓存页面的最后修改时间发送给服务器,服务器会将此时间与实际文件的最后修改时间进行比较。
如果时间相同,服务器返回HTTP状态码304而不是文件内容。客户端收到信息后,将本地缓存文件加载到浏览器中。此时,MSXML2.XMLHTTP 对象实际上读取了本地缓存的数据。
相反,如果时间不一致,服务器返回 HTTP 状态码 200 和新文件内容。客户端收到信息后,丢弃旧文件,缓存新文件,加载到浏览器中。此时,MSXML2.XMLHTTP 对象读取服务器发送的新数据。
第23-30行遍历HTML DOM对象的h3标签,是百度网页的三级标题。
第26行至第29行代码分别获取标签下标签为a的第一个子节点的文本内容和链接URL。
运行过程的部分结果如下。