动态渲染的通用解决办法

前言

     我们发现动态渲染的技术组合很灵活,如果每次遇到这种网站都需要猜解接口参数,跟进和分析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就要向浏览器发送如下两次请求。

  • 访问指定的URL。
  • 获取俩兰奇当前的网页文本。

     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,允许程序更灵活地控制页面元素。

小结

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

关注不迷路哦

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成都—大数据开发工程师—杨洋

你的打赏是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值