php多线程抓取网页(如何实现GET、POST、Header、Cookie等诸多细节?)

优采云 发布时间: 2022-04-02 23:00

  php多线程抓取网页(如何实现GET、POST、Header、Cookie等诸多细节?)

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

  2.修复登录问题

  使用 Click 模拟登录比在 url 中写入用户名和密码或发送请求更简单、更通用。特别是一些网站表单在提交时需要执行额外的脚本,或者在登录时跨域发送登录信息。

  如果遇到跨域登录或者iframe,请参考附件代码最后一段:点击后等待最终登录返回页面,而不是等待登录页面加载完毕。

  如果在使用XMLhttp发送登录请求时遇到登录问题,建议不要考虑伪造cookie,使用Webbrowser登录。登录后,同一个Excel进程中的所有XMLhttp和Webbrowser都会共享这个登录信息。特别担心。

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

  3. 使用异步加速

  等待网页一个一个返回太慢了,所以我们不是同步发送一个一个等待,而是使用异步,一次发送一批请求,统一等待。初衷当然是好的,但是VBA不支持多线程,所以这里的速度提升比较有限,一次发送20个请求只能提升2倍左右的速度。更多似乎没有帮助。 nThread值的选择很大程度上取决于爬升的速度网站,建议多试几次。

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

  也许很多人都告诉过你,VBA 不支持多线程。是的,不支持,使用API​​极其繁琐且不稳定。但是,Windows 操作系统支持多线程,我们利用这一点来规避 VBA 的限制。不仅有办法,而且有三种。

  4.1 使用VBScript添加应用程序

  保存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倍左右,效率非常高。测试电脑为i7台式电脑,4核8线程,8G内存。爬虫网络在爬取时,每个WPS ET线程占用的内存大概不到100M,机器完全可以承受。

  作为爬虫,你可能会遇到很多问题,比如翻页、动态网页、json解析、保存附件等。有时会添加延迟以避免被网站阻塞。具体问题只能在抓取过程中分解。祝大家好运。

  以上。

  修复老狼

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线