动态渲染的通用解决办法

我们发现动态渲染的技术组合很灵活,如果每次遇到这种网站都需要猜解接口参数,跟进和分析Javascript代码逻辑,那么消耗的事件成本就很高了。当目标网站发生产品迭代升级或针对爬虫有意改动代码,爬虫工程师就需要做对应的调整。可能目标网站的前端工程师只需要花2个小时编写用于加密请求参数的代码,而爬虫工程师却要花费3天时间才能分析出正确的计算逻辑。

我们只要解决页面渲染问题,就能解决反爬虫问题,事实上,确实有很多的渲染工具可以满足需求,其中最常用的是Puppeteer、Splash、Selenium,这三种工具对应的文档连接如下:

Puppeteer:https://pypi.org/project/pyppeteer2/
Selenium: https://www.selenium.dev/documentation/en/
Splash: https://splash.readthedocs.io/en/latest/

Selenium套件

Selenium是一个用于测试Web应用程序的工具。我们通过Selenium和浏览器驱动调用浏览器执行特定的操作,如发起网络请求、点击操作、鼠标下滑。由于调用的是浏览器,所以这种组合还具备了资源自动加载和渲染的能力。

浏览器驱动是连接Selenium和浏览器的单向通道,Selenium的指令通过浏览器驱动传递给浏览器,浏览器接收到指令后会做出对应的操作。这种关系并不是双向的,浏览器无法向Selenium发送指令或者传递渲染结果。加入我们想要获取某个网站页面渲染后的网页文本,Selenium就要向浏览器发送如下两次请求。
1.访问指定的URL。
2.获取俩兰奇当前的网页文本。

Selenium、浏览器驱动和浏览器是一个完整的组合,缺一不可,我们可以将这个组合称为Selenium套件。

代码模拟用户正常操作时的逻辑为:首先用浏览器打开指定的网页,在网页中找到对应的按钮并点击,然后打印网页文本,最后关闭浏览器。

异步渲染库Puppeteer

在Selenium套件的支持下,我们很轻松地完成了爬取任务。但Selenium套件也有一定的缺陷,当我们使用Python中的异步库编写爬虫时,Selenium就不是那么合适了。异步是目前提升爬虫效率的常用手段之一,越来越多的人将同步的爬虫代码改为异步。由于浏览器是以进程的方式启动,所以它无法满足异步爬虫的渲染需求,为什么这么说呢?异步爬虫可以做到每秒向300个页面发起请求,但是要在计算机中开启300个浏览器进程或者300个标签页是很困难的,这会导致堵塞,影响异步爬虫程序的整体效率。

Puppeteer是Google开源的Node库,它提供了一个高级API来控制Chrome浏览器,浏览器中大多数手动执行的操作都可以使用Puppeteer完成,更重要的是Puppeteer支持异步。Puppeteer是一个Node库,如果你的爬虫程序是Node.js编写的,那么可以直接使用这个库,如果爬虫程序是用python编写的,那么就需要用支持Python的库Pypeteer。

异步渲染服务器Splash

如果只需要在一台及计算机上运行爬虫,那么使用Selenium套件或者Puppeteer就可以满足渲染需求了。但如果是分布式爬虫呢?假如我们需要在30台服务器上启动爬虫程序,那么我们就得在每一台机器上都安装Pupeteer或者配置Selenium套件吗?

Splash是一个异步的JavaScript渲染服务,它是带有HTTP API的轻量级Web浏览器。Splash能够并行地处理多个页面请求,在页面上下文中执行自定义地Javascript以及模拟浏览器中地点击、下滑等操作。有了Splash之后情况就变得不一样了,我们可以将Splash服务器部署到云服务器上并配置负载均衡。多个爬虫程序可以使用同一个API接口渲染页面。

这样做地好处是当渲染服务压力大地时候,我们可以动态地增加Splash渲染服务。多个爬虫程序共用Splash服务还可以节省硬件资源。说完Splash地优势后,我们来看如何将爬虫程序和Splash结合起来,完成签名验证反爬虫地绕过。

渲染工具之间地区别

Selenium套件通过驱动浏览器执行操作,本质上使用浏览器
Puppeteer实际上通过API控制Chromium或Chrome浏览器
Splash基于开源地浏览器引擎WebKit

相当于直接使用浏览器地Selenium套件和Puppeteer来说,Splash在页面渲染、对新特性地支持等方面是比较差。这个差距表现在对DOM节点地渲染和HTML Element事件操作上,例如点击事件触发后内容无法渲染到指定地位置。

我们在浏览器中常用地操作有点击、滑动、拖拽、文本输入和复制等,还有一些特殊地操作,比如页面地前进/后退、截图、文件下载等。3种工具都能够完成这些操作,并且开放了对应地API,允许程序更灵活地控制页面元素。

小结

动态网页地出现对爬虫程序造成了很大地影响。在不借助渲染工具地情况下,爬虫程序很难获得动态网页中地数据,但是并不代表爬虫程序只有这一个选择。

原创文章 93 获赞 65 访问量 12万+

猜你喜欢

转载自blog.csdn.net/weixin_43870646/article/details/105314546
今日推荐