“ 大数据时代,衍生出了许多跟数据相关的公司和行业。在这个数据为王的时代,每个人都必须掌握一手获取数据的能力!”
01
—
什么是Puppeteer?
Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。我们来看看Puppeteer单词原本的意思:
Puppete 的原意为木偶,即很多90后小时候听的木偶奇遇记的故事里面讲述的那个说谎后鼻子会变长的“小孩”。根据这个单词的意思,我们就很清楚的明白Puppeteer的执行原理就是像操纵木偶的人一样,通过各种方式(接口)进行操纵浏览器帮你执行各种操作的工具。
02
—
Puppeteer 能帮我们具体做什么?
简单来说,你能在浏览器里做的大部分事情,Puppeteer都可以做!像打开标签页,打开百度,输入搜索关键词,点击搜索,点击下一页....等等你的日常操作行为都能模拟,其它的你不常使用的楷哥也整理了一些:
生成页面 PDF
抓取 SPA(单页应用)并生成预渲染内容(即“SSR”(服务器端渲染))
自动提交表单,进行 UI 测试,键盘输入等
创建一个实时更新的自动化测试环境
使用最新的 JavaScript 和浏览器功能直接在最新版本的Chrome中执行测试
捕获网站的timeline trace,帮助你分析该网站的性能问题
测试浏览器的自动化扩展
03
—
Puppeteer 为什么可以做到控制浏览器?
Puppeteer之所以可以帮助我们做这么多,首先我们需要分析下Puppeteer的整体架构:
我们可以从图中看到Puppeteer将浏览器分为了几个部分:Browser(浏览器),Context(上下文),Page(页面或标签),Workers(工人)等部分,他们之间的关系是:
Puppeteer 使用 DevTools 协议 与浏览器进行通信。
Browser 实例可以拥有浏览器上下文。
BrowserContext 实例定义了一个浏览会话并可拥有多个页面。
Page 至少有一个框架:主框架。可能还有其他框架由 iframe 或 框架标签 创建。
frame 至少有一个执行上下文 - 默认的执行上下文 - 框架的 JavaScript 被执行。一个框架可能有额外的与 扩展 关联的执行上下文。
Worker 具有单一执行上下文,并且便于与 WebWorkers 进行交互。
04
—
Puppeteer VS Puppeteer-core?
Puppeteer从v1.7.0开始,每个版本都会发布两个包:
Puppeteer
Puppeteer-core
Puppeteer是浏览器自动化的产品。安装后,它会下载一个版本的 Chromium,然后使用Puppeteer-core 驱动工作。作为最终用户产品,Puppeteer支持一堆方便的 PUPPETEER* env 变量来调整行为。Puppeteer-core 是一个核心库来帮助驱动任何支持 DevTools 协议的东西。Puppeteer-core 在安装时不会下载 Chromium。作为一个库,Puppeteer-core 是完全是通过其编程接口驱动的并忽略所有PUPPETEER* env 变量。
总结一下,Puppeteer-core 与Puppeteer不同的地方:
Puppeteer-core 在安装时不会自动下载 Chromium
Puppeteer-core忽略所有的 PUPPETEER_* env 变量
大多数情况下,你可以使用Puppeteer来进行实际的应用开发,而如果是考虑下载及打包速度问题或者正在构建一个DevTools协议顶部的产品库,这时你可以选择使用Puppeteer-core来进行开发。
05
—
爬虫扫地僧?为什么?
了解了Puppeteer的背景及功能,很多朋友都会猜到为什么Puppeteer被称之为爬虫界的扫地僧了吧?因为其模拟的是真实用户的操作,从打开标签页,到输入关键词,甚至在输入过程中模拟用户打字速度的这种精细操作都会严重混淆服务端风控服务的判断,那一般的风控系统会从几个方面进行反爬虫?
接口调用频次限制
同IP的访问频次
验证码
登录token验证
链接随机化
Request请求头验证
......
但这些验证对Puppeteer来说,基本无效。因为对于整个请求方式和行为判断上讲,用户的真实场景模拟会直接宣布以上拦截方案的死刑。
本文简单了解了Puppeteer的背景及整体架构,那肯定会有朋友问具体怎么使用呢?关注楷哥,我们继续交流探讨。