現(xiàn)在爬蟲這么火厘肮,尤其是用python和R來(lái)實(shí)現(xiàn),但是對(duì)于不是專業(yè)編程人員睦番,平時(shí)接觸過(guò)的語(yǔ)言就只是依賴于office的vba类茂,而我們需要的數(shù)據(jù)又是來(lái)源于網(wǎng)絡(luò),那該怎么辦呢托嚣?其實(shí)vba也可以辦到爬蟲大部分的網(wǎng)頁(yè)數(shù)據(jù)巩检。那么我們就來(lái)看下應(yīng)該怎么去寫
在看下面的內(nèi)容之前,建議先看下VBA與網(wǎng)抓示启,VBA抓取網(wǎng)頁(yè)數(shù)據(jù)XMLHTTP對(duì)象
需求:將電影名兢哭,主演,上映時(shí)間夫嗓,國(guó)家迟螺,評(píng)分等5個(gè)信息給提取下來(lái)
1.先寫出基本架構(gòu)
Sub maoyanTop100()
Url = "http://maoyan.com/board/4?offset=0" '貓眼電影top100網(wǎng)址
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") '創(chuàng)建一個(gè)xmlhttp對(duì)象
Set oDom = CreateObject("htmlfile") '創(chuàng)建一個(gè)Dom對(duì)象 'XmlHttp對(duì)象(MSXML2.XMLHTTP)向http服務(wù)器發(fā)送請(qǐng)求并使用微軟XML文檔對(duì)象模型Microsoft? XML Document Object Model (DOM)處理回應(yīng)贡避。
With oHttp 'open橱鹏,創(chuàng)建一個(gè)新的http請(qǐng)求烘绽,并指定此請(qǐng)求的方法蛀蜜、URL以及驗(yàn)證信息(用戶名/密碼) 'send,發(fā)送請(qǐng)求到http服務(wù)器并接收回應(yīng)
.Open "GET", Url, False '使用Open方法仅仆,用get請(qǐng)求成畦,F(xiàn)alse代表非異步加載
.send '將open方法的信息發(fā)送給網(wǎng)頁(yè)服務(wù)器
oDom.body.innerHtml = .responseText '將響應(yīng)網(wǎng)頁(yè)的HTML賦值給Dom對(duì)象硬纤,并只需要body標(biāo)簽里面的內(nèi)容
End With
End Sub
2.接下來(lái)我們要將oDom里面的信息給提取出來(lái)
通過(guò)對(duì)網(wǎng)頁(yè)源代碼的分析敞峭,可以發(fā)現(xiàn),每部電影的信息隱藏在<dd>...</dd>這個(gè)標(biāo)簽里的
接下來(lái)我們就可以這樣子寫
Sub maoyanTop100()
Url = "http://maoyan.com/board/4?offset=0" '貓眼電影top100網(wǎng)址
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") '創(chuàng)建一個(gè)xmlhttp對(duì)象
Set oDom = CreateObject("htmlfile") '創(chuàng)建一個(gè)Dom對(duì)象
'XmlHttp對(duì)象(MSXML2.XMLHTTP)向http服務(wù)器發(fā)送請(qǐng)求并使用微軟XML文檔對(duì)象模型Microsoft? XML Document Object Model (DOM)處理回應(yīng)球订。
With oHttp
'open后裸,創(chuàng)建一個(gè)新的http請(qǐng)求,并指定此請(qǐng)求的方法冒滩、URL以及驗(yàn)證信息(用戶名/密碼) 'send,發(fā)送請(qǐng)求到http服務(wù)器并接收回應(yīng) .Open "GET", Url, False '使用Open方法轻抱,用get請(qǐng)求,F(xiàn)alse代表非異步加載
.send '將open方法的信息發(fā)送給網(wǎng)頁(yè)服務(wù)器
oDom.body.innerHtml = .responseText '將響應(yīng)網(wǎng)頁(yè)的HTML賦值給Dom對(duì)象旦部,并只需要body標(biāo)簽里面的內(nèi)容
End With
i = 2
For Each Item In oDom.all
If Item.tagname = "DD" Then
Range("a" & i) = Item.Children(1).getAttribute("title") '電影名信息
Range("b" & i) =Item.Children(2).Children(0).Children(0).Children(1).innerText '主演
Range("c" & i) = Item.Children(2).Children(0).Children(0).Children(2).innerText '上映時(shí)間和國(guó)家
Range("d" & i) = Item.Children(2).Children(0).Children(1).Children(0).innerText '評(píng)分
i = i + 1
End If
Next
End Sub
通過(guò)上面的代碼祈搜,就可以將一頁(yè)的所有電影信息都給爬取下來(lái),但是我們要爬取的是100個(gè)電影士八,我們必須將其他網(wǎng)頁(yè)的信息也可提取下來(lái)容燕,通過(guò)對(duì)網(wǎng)頁(yè)鏈接的觀察,我們發(fā)現(xiàn)婚度,網(wǎng)頁(yè)是這樣一個(gè)規(guī)律:
所以蘸秘,我們可以通過(guò)循環(huán)將所有頁(yè)面的鏈接循環(huán)一遍,得到最終的代碼:
Sub maoyanTop100()
i = 2
For n = 0 To 9
Url = "http://maoyan.com/board/4?offset=" & n * 10
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP")
Set oDom = CreateObject("htmlfile")
With oHttp
.Open "GET", Url, False
.send
oDom.body.innerHtml = .responseText
End With
For Each Item In oDom.all
If Item.tagname = "DD" Then
Range("a" & i) = Item.Children(1).getAttribute("title")
Range("b" & i) = Item.Children(2).Children(0).Children(0).Children(1).innerText
Range("c" & i) = Item.Children(2).Children(0).Children(0).Children(2).innerText
Range("d" & i) = Item.Children(2).Children(0).Children(1).Children(0).innerText
i = i + 1
End If
Next
Next n
MsgBox "Done 蝗茁!"
End Sub