excel的一些小技巧教程VBA For Excel爬虫专题

爬虫这么火,只会vba怎么办?那就用vba啊

2017-10-26  本文已影响377人  鸣人吃土豆

现在爬虫这么火,尤其是用python和R来实现,但是对于不是专业编程人员,平时接触过的语言就只是依赖于office的vba,而我们需要的数据又是来源于网络,那该怎么办呢?其实vba也可以办到爬虫大部分的网页数据。那么我们就来看下应该怎么去写

在看下面的内容之前,建议先看下VBA与网抓VBA抓取网页数据XMLHTTP对象

需求:将电影名,主演,上映时间,国家,评分等5个信息给提取下来

1.先写出基本架构

Sub maoyanTop100() 
Url = "http://maoyan.com/board/4?offset=0" '猫眼电影top100网址 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") '创建一个xmlhttp对象 
Set oDom = CreateObject("htmlfile") '创建一个Dom对象 'XmlHttp对象(MSXML2.XMLHTTP)向http服务器发送请求并使用微软XML文档对象模型Microsoft® XML Document Object Model (DOM)处理回应。 
With oHttp 'open,创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码) 'send,发送请求到http服务器并接收回应 
    .Open "GET", Url, False '使用Open方法,用get请求,False代表非异步加载 
    .send '将open方法的信息发送给网页服务器
     oDom.body.innerHtml = .responseText '将响应网页的HTML赋值给Dom对象,并只需要body标签里面的内容 
End With
End Sub

2.接下来我们要将oDom里面的信息给提取出来

猫眼电影top100首页

通过对网页源代码的分析,可以发现,每部电影的信息隐藏在<dd>...</dd>这个标签里的

接下来我们就可以这样子写

Sub maoyanTop100() 
Url = "http://maoyan.com/board/4?offset=0" '猫眼电影top100网址 
Set oHttp = CreateObject("MSXML2.ServerXMLHTTP") '创建一个xmlhttp对象 
Set oDom = CreateObject("htmlfile") '创建一个Dom对象 

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

With oHttp 
'open,创建一个新的http请求,并指定此请求的方法、URL以及验证信息(用户名/密码) 'send,发送请求到http服务器并接收回应 .Open "GET", Url, False '使用Open方法,用get请求,False代表非异步加载 

    .send '将open方法的信息发送给网页服务器 
     oDom.body.innerHtml = .responseText '将响应网页的HTML赋值给Dom对象,并只需要body标签里面的内容 
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 '上映时间和国家 
    Range("d" & i) = Item.Children(2).Children(0).Children(1).Children(0).innerText '评分 
    i = i + 1 
  End If 
Next
End Sub

通过上面的代码,就可以将一页的所有电影信息都给爬取下来,但是我们要爬取的是100个电影,我们必须将其他网页的信息也可提取下来,通过对网页链接的观察,我们发现,网页是这样一个规律:

所以,我们可以通过循环将所有页面的链接循环一遍,得到最终的代码:

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
上一篇下一篇

猜你喜欢

热点阅读