反爬虫页面的爬虫利器 Puppeteer

今天给大家介绍一款反爬虫页面的爬虫利器 Puppeteer。

Puppeteer 是谷歌官方出品的一个通过 DevTools 协议控制 headless Chrome 的 Node 库。可以通过 Puppeteer 的提供的 API 直接控制 Chrome 模拟大部分用户操作来进行 UI Test 或者作为爬虫访问页面来收集数据。

它的最大优点就是可以处理网页中的动态内容,如 JavaScript,能够更好的模拟用户。

有些网站的反爬虫手段是将部分内容隐藏于某些 javascript/ajax 请求中,致使直接获取 a 标签的方式不奏效。甚至有些网站会设置隐藏元素 「陷阱」,对用户不可见,脚本触发则认为是机器。这种情况下,Puppeteer 的优势就凸显出来了。

Puppeteer 优势

  • 生成网页的截屏(目前仅支持支持jpeg、png 格式)和 pdf 文件;
  • 爬取 SPA 和异步渲染网页;
  • 自动表单提交、键盘输入、UI 测试等;
  • 创建最新的自动测试环境,也就是说可以使用最新的浏览器特性;
  • 捕获站点的时间线以帮助分析性能问题。

Puppeteer 本质上是一个 headless chrome,无头浏览器,是一种没有界面的浏览器。与普通浏览器最大的不同是,无头浏览器执行过程中看不到运行的界面,但是你依然可以用 GUI 测试框架的截图功能截取它执行中的页面。

无头浏览器的主要应用场景,包括 GUI 自动化测试、页面监控以及网络爬虫这三种。

但是,无头浏览器并不完美,它最大的缺点是,不能完全模拟真实的用户行为,而且由于没有实际完成页面的渲染,所以不太适用于需要对于页面布局进行验证的场景。同时,业界也一直缺乏理想的无头浏览器方案。

在 Google 发布 Headless Chrome 之前,PhantomJS 是业界主流的无头浏览器解决方案。但是,这个项目的维护一直以来做得都不够好,已知未解决的缺陷数量多达 1800 多个,虽然支持主流的 Webkit 浏览器内核,但是依赖的 Chrome 版本太低。所以,无头浏览器一直难以在 GUI 自动化测试中大规模应用。

但好消息是,2017 年 Google 发布了 Headless Chrome,以及与之配套的 Puppeteer 框架,Puppeteer 不仅支持最新版本的 Chrome,而且得到 Google 官方的支持,这使得无头浏览器可以在实际项目中得到更好的应用。

也正是这个原因,PhantomJS 的创建者 Ariya Hidayat 停止了它的后续维护,Headless Chrome 成了无头浏览器的首选方案。

Puppeteer 也是由 Google 开发的,所以它可以很好地支持 Headless Chrome 以及后续 Chrome 的版本更新。

环境安装

先安装 Node,如果你之前安装过,查看下它的版本,Puppeteer 对于一些低版本的 Node 是不支持的,我推荐使用 8 以上的版本,否则 Node 在后面使用 Puppeteer 的时候会
抛出 SyntaxError: Unexpected token 的异常。安装新版本后 cmd 终端用命令 node -v 查看版本,和你安装的版本一致表示安装成功。

Puppeteer 安装

由于封网,直接下载 Chromium 会失败,可以先阻止下载 Chromium 然后再手动下载它。

Puppeteer 安装命令

错误信息

直接通过上面的命令安装一般会报错:(左右滑动查看所有代码)

这时我们采用以下解决方案:

1、设置环境变量跳过下载 Chromium

2、或者可以这样干,只下载模块而不 build(我用的是这种方法)

3、成功安装模块
忽略了 Chromium 就可以下载成功,下载成功信息如下:(左右滑动查看所有代码)

下载 Chromium

刚才我们是直接忽略了 Chromium 的下载,接下来我们需要手动下载 Chromium,在下载之前,我们先来了解下 Chromium 浏览器和 Chrome 浏览器有什么区别。

Chromium 是谷歌为了研发 Chrome 而启动的项目,两者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。由于两款浏览器「同根同源」,因此它们有着同样的 logo,只是配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。

Chromium 下载地址如下:

我下的是 windows 版本的,如果你也是 windows 系统,在网站上下载比较慢的话也可以在我的公众号「Python知识圈」回复「chromium」获取 windows 版的 chromium。

编辑器设置

我用的编辑器是 Pycharm,要想在编辑器中使用 Node,需要安装 Node 插件,File–>Settings–>Plugins 中输入 Node 插件安装。

在项目里安装 Puppeteer

安装好后建一个空文件夹,Pycharm 在其中新建 Node 项目,在新建的项目中编辑器终端 Terminal 输入 npm -v和 cnpm -v,查看 npm 和 cnpm,再输入:cnpm i puppeteer 进行安装,或者你也可以在 cmd 命令下进入 node 项目里,再使用上面的命令,等待安装成功。

简单的demo

接下来我们做一个简单的 demo:打开 pk 哥的博客并进行截图操作。和上次文章我讲 RF 框架中用 Selenium2Library 第三方库通过 webdriver 启动浏览器的效果一样,只是上次我们会看到有浏览器在操作,这次我们完全看不到浏览器在操作,我们对此是无感的。

演示图中我们看到运行后截图就直接直接保存在项目目录中了,我们看不到具体的操作步骤。

动态图可能看不清楚截图,以下是截图。

那这部分代码怎么写呢,我们先在项目里新建一个 js 文件,用 Node 编写代码。如需要源码,可在公众号「Python知识圈」回复「node」获取。

代码主要由以下步骤:
1、启动 Puppeteer;
2、给出 chromium 安装地址;
3、通过 Puppeteer 启动网页;
4、截图并保存。

其中需要设置一些参数,重要参数说明如下:(左右滑动查看所有代码)

headless 如果设置为 false 的话,运行代码我们就会看到浏览器打开的操作。

Puppeteer 常见操作

  • page.type 获取输入框焦点并输入文字;
  • page.keyboard.press 模拟键盘按下某个按键,目前 mac 上组合键无效为已知 bug;
  • page.waitFor 页面等待,可以是时间、某个元素、某个函数;
  • page.frames() 获取当前页面所有的 iframe,然后根据 iframe 的名字精确获取某个想要的 iframe;
  • iframe.$(‘.srchsongst’) 获取 iframe 中的某个元素;
  • iframe.evaluate() 在浏览器中执行函数,相当于在控制台中执行函数,返回一个 Promise;
  • Array.from 将类数组对象转化为对象;
  • page.click() 点击一个元素;
  • iframe.$eval() 相当于在 iframe 中运行 document.queryselector 获取指定元素,并将其作为第一个参数传递;
  • iframe.$$eval 相当于在 iframe 中运行 document.querySelectorAll 获取指定元素数组,并将其作为第一个参数传递。

掌握了这些操作的话,那些有反爬机制的网页在它面前不值一提,因为它能做到可见即可爬。

感觉怎么样,这样的利器还不赶紧掌握起来,换种思路去玩爬虫或者自动化测试,你会有不一样的收获。

Puppeteer 的 GitHub 地址:点击这里

今天的内容就分享到这里,希望对你有帮助,祝进步!

 

文章为pk哥原创,我在我的公众号: Python 知识圈 上会分享更多心得体会,你也可以关注。

***版权申明:本文为 Python知识圈 pyzhishiquan.com 原创,没有Python知识圈书面授权,请勿以任何形式转载,摘编,复制或镜像。***

为您推荐

发表评论

电子邮件地址不会被公开。