分享

VBA也能来爬虫(抓取糗百糗图)

 VBA说 2020-04-07

最近一直在研究VBA网抓的东西,当然,爬虫的话首选python语言,无奈还要从新学习python。听说VBA也能用来网抓,就查找各方面关于VBA网抓的资料学习了一下。

模仿着,也写出来了几个简单的网抓小程序,深深感受到,如果学精通了网抓,整个互联网都是你的。 

这次分享的是网抓糗事百科糗图前30页所有糗图的代码,当然其他网站的图片也是可以批量抓取的...比如百度图片、1024、此处省略。

一、思路,最重要的还是思路。

打开糗事百科主页,糗图页面。通过xmlhttp对象循环得到每一页的网页代码,通过正则表达式,在网页代码中找到图片的真实网页地址,然后依次打开网址,把图片保存到本地。

理论回头学会了我再慢慢分享,现在我也属于比葫芦壶瓢阶段,毕竟,兴趣是最好的老师。

二、效果及代码

我们先上效果和代码,我都迫不及待展示了。

效果:

奉上代码:

网抓具有时效性,网站不是一成不变的,有可能过阵子代码就失效了,所以,思路很重要,学会思路就可以。

Sub 下载糗事百科图片()

    Dim b() As Byte

    For pagenum = 1 To 30

        Dim xmlhttp As Object

        Set xmlhttp = CreateObject("MSXML2.XMLHTTP")

        strurl = "https://www./pic/" & "page/" & pagenum

        xmlhttp.Open "GET", strurl, False

        xmlhttp.send

        Do While xmlhttp.ReadyState <> 4

            DoEvents

        Loop

        strText = xmlhttp.responseText

        Set reg = CreateObject("vbscript.regexp")

        reg.Global = True

        reg.IgnoreCase = True

        reg.MultiLine = True

        reg.Pattern = "pic./system/pictures/\d+/\d+/medium/app\d+.jpeg"

        Set Match = reg.Execute(strText)

        For Each mat In Match

            n = n + 1

            xmlhttp.Open "GET", "https://" & mat, False

            xmlhttp.send

            Do While xmlhttp.ReadyState <> 4

                DoEvents

            Loop

            b = xmlhttp.responseBody

            Open ThisWorkbook.Path & "\图片\" & n & ".jpg" For Binary As #1

            Put #1, , b

            Close

        Next

    Next

    MsgBox "完成"

End Sub

说几个知识点:

① reg.Pattern = "pic./system/pictures/\d+/\d+/medium/app\d+.jpeg"

这里是为了通过正则匹配到图片的真实网址。

②  b = xmlhttp.responseBody

     Open ThisWorkbook.Path & "\图片\" & n & ".jpg" For Binary As #1

     Put #1, , b

     Close

把传输的照片写入图片文件,需要以二进制形式打开并保存。

三、VBA网抓常用方法

1、xmlhttp/winhttp法:
用xmlhttp/winhttp模拟向服务器发送请求,接收服务器返回的数据。
优点:效率高,基本无兼容性问题。
缺点:需要借助如fiddler的工具来模拟http请求。
2、IE/webbrowser法:
创建IE控件或webbrowser控件,结合htmlfile对象的方法和属性,模拟浏览器操作,获取浏览器页面的数据。
优点:这个方法可以模拟大部分的浏览器操作。所见即所得,浏览器能看到的数据就能用代码获取。
缺点:各种弹窗相当烦人,兼容性也确实是个很伤脑筋的问题。上传文件在IE里根本无法实现。
3、QueryTables法:
因为它是excel自带,所以勉强也算是一种方法。其实此法和xmlhttp类似,也是GET或POST方式发送请求,然后得到服务器的response返回到单元格内。
优点:excel自带,可以通过录制宏得到代码,处理table很方便
。代码简短,适合快速获取一些存在于源代码的table里的数据。
缺点:无法模拟referer等发包头
引自:http://club./thread-1159783-1-1.html
吴姐写的教程

本次分享的小程序用到的用的就是第一种方法中的xmlhttp法

xmlhttp法常用代码框架:

Sub Main()

    DimstrText As String

    With CreateObject("MSXML2.XMLHTTP")

        .Open "GET", "", False

        .send

        strText = .responseText

        Debug.Print strText

        EndWith

End Sub

简单的网页,只需要填空就行。复杂的需要涉及到工具分析。

这次先分享到这里,VBA网抓会继续学习,争取抓取出海量有深度的内容。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多