搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 老狼wolfccb > VBA网页爬虫和多线程指南

VBA网页爬虫和多线程指南

老狼wolfccb 2018-02-28

如果你能点进这篇文章,那我们一定是同道中人,我就开门见山直奔主题了。此文将概述VBA爬虫从简单实现到多线程的各种主要思路。需要你有一点VBA和网络前端基础。


本文的代码均在WPS的ET表格下测试通过,Office Excel应该也没有兼容性问题。是为“孙悟空”系列爬虫的独家秘笈。


内容提要

  • VBA爬取网页的方式

  • 解决登录问题

  • 利用异步加快速度

  • 看似不可能的多线程实现

  • 总结



1. VBA爬取网页的方式

简单来说,常用的思路有两种:

1.1 使用Webbrowser控件

相当于在Office里打开一个看得见的IE。优点是实现简单,易于调试,整个抓取过程直观可视,易于解决动态网页、跨域登录等棘手问题。缺点是不灵活,有些网页处理不了;还有就是速度慢,很慢,毕竟除了通信之外还需要IE来渲染网页。

1.2 使用XMLhttp对象

优点是速度快,灵活,可以实现GET、POST、Header、Cookie等诸多细节。缺点是比Webbrowser麻烦一点,调试不直观。为了方便引用网页中的信息,不妨把XMLhttp的responsetext装进一个HTMLfile对象,就可以像Webbrowser一样检索了。

2. 解决登录问题

用Click模拟登录比把用户名、密码写在url里或者send请求来的简单,通用性也更好。尤其是有些网站的表单submit时要执行额外的script,或者登录时要跨域发送登录信息。

如果遇到跨域登录或者iframe的情况,参照所附代码最后一段:Click之后等待最终的登录返回页面,而不是等待登录页加载完毕。

如果使用XMLhttp发送登录请求遇到登录问题,建议就不要费力气琢磨什么伪造Cookie了,使用Webbrowser来登录吧,登录后同一个Excel进程里的所有XMLhttp和Webbrowser都会共享到这个登录信息,特别省心。

使用Set oIE = CreateObject("internetexplorer.application")不能和Webbrowser以及XMLhttp互相共享登录信息,Winhttp似乎也不能。

3. 利用异步加快速度

一个一个等待网页返回太慢,所以我们不用同步方式send一个等待一个,而是用异步,一次send一批请求出去,统一等待。初衷当然很好,然而VBA不支持多线程,所以这里的速度提高比较有限,一次发送20个请求大概只能提速2倍。再多似乎没什么用了。nThread值的选择在很大程度上于所爬网站的速度,建议多次测试决定。

4. 看似不可能的多线程实现

也许有很多人跟你说过VBA不支持多线程。没错,它确实不支持,用API极其麻烦而且不稳定。但是,Windows操作系统支持多线程,我们就利用这一点来绕开VBA的限制。不光有办法,而且有三种。

4.1 利用VBScript加Application

将含有宏的工作簿另存n份,生成n个VBScript脚本文件,每个脚本用Excel.Application对象打开一个工作簿,运行每个工作簿里的VBA爬虫,将爬到的结果统一写回主Excel里。这种方式有两个好处:一是用字符串的VBScript代码比较简洁,二是每个线程都可以利用Webbrowser控件方便地登录。缺点就是打开一批Excel导致系统负担较重。searchWorker过程里创建了一个Excel对象,通过工作簿名称workbookName将爬到的数据写回原工作簿。

4.2 只用VBScript实现多线程

有了上一节的示例,很容易就可以构造出合适的VBScript文件,并且在文件里直接抓取数据,代码我就不放了。比起VBScript加Application的方法,只用VBScript拼字符串写起来更麻烦,但程序执行起来非常轻量级,所以如果你要抓取的网站没有复杂的登录过程,又不怕代码麻烦,那么可以考虑用VBScript。示例可以在Excelhero找到,代码相当乱而且长。

4.3 使用ActiveX EXE实现多线程

这个有前人写过,优点是资源消耗适中,缺点是需要有Visual Basic环境,实现起来也更复杂,可在excelhome找到。

5. 总结

我个人推荐VBScript加Application的多线程方案,通用性更强,而且现在的电脑已经不太在乎多占些内存了。比起本文前面使用XMLhttp批量异步发送的方法,VBS+Application的方案创建8个线程可以提速5倍左右,效率很高。测试电脑是4核心8线程的i7台式机,8G内存。爬虫网抓时,每个WPS ET线程大概占用不到100M内存,机器完全可以承受。


做爬虫可能会遇到很多问题,比如翻页、动态网页、json解析、保存附件等等。有时为了避免被网站封杀,还要加上一些延时。具体问题只能在抓取过程中各个击破。祝各位好运。


以上。

搞定搞不定的老狼

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《VBA网页爬虫和多线程指南》的版权归原作者「老狼wolfccb」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注老狼wolfccb微信公众号

老狼wolfccb微信公众号:gh_ad76ca16c088

老狼wolfccb

手机扫描上方二维码即可关注老狼wolfccb微信公众号

老狼wolfccb最新文章

精品公众号随机推荐