Skip to content

Google Puppeteer 入门

puppeteer 翻译是操纵木偶的人,利用这个工具,我们能做一个操纵页面的人。 puppeteer 是一个 nodejs 的库,支持调用 Chrome 的 API 来操纵 Web,相比较 Selenium 或是 PhantomJs, 它最大的特点就是它的操作 Dom 可以完全在内存中进行模拟既在 V8 引擎中处理而不打开浏览器,而且关键是这个是 Chrome 团队在维护,会拥有更好的兼容性和前景。

功能

  • 生成页面的截图和 PDF。
  • 抓取 SPA 并生成预先呈现的内容。
  • 从网站抓取你需要的内容。
  • 自动表单提交,UI 测试,键盘输入等。
  • 创建一个最新的自动化测试环境。使用最新的 JavaScript 和浏览器功能,直接在最新版本的 Chrome 中运行测试。
  • 捕获您的网站的时间线跟踪,以帮助诊断性能问题。

入门

环境和安装

Puppeteer 至少需要 Node v6.4.0,如要使用 async/await,只有 Node v7.6.0 或更高版本才支持。 node 下载地址: https://nodejs.org/zh-cn/

创建项目

创建 test 目录,进入目录执行 npm init

安装 puppeteer

sh
npm i puppeteer
## 或
yarn add puppeteer

可能会出现以下报错:

sh
ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOA
D" env variable to skip download.

是因为在执行安装的过程中需要执行 install.js,这里会下载 Chromium, 官网建议是进行跳过,我们可以执行 —ignore-scripts 忽略这个 js 执行。 也可以通过设置环境变量 set PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 阻止下载 Chromium (因为封网,直接下载会失败)

sh
npm i --save puppeteer --ignore-scripts

手动下载 Chromium

下载地址:https://download-chromium.appspot.com/ (打开蓝灯翻墙软件...)

把下载刚刚下载的文件解压出来会有 chrome-win32 文件夹,把里面的文件拷贝到项目新建的 chromium 文件夹中

新建 index.js(截图功能), 代码如下:

js
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto("https://y.qq.com");
  await page.screenshot({ path: "yqq.png" });
  browser.close();
})();

打开 cmd 执行 index.js

sh
node index.js

这时候可能出现以下错误:

sh
(node:8672) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejec
tion id: 1): AssertionError [ERR_ASSERTION]: Chromium revision is not downloaded
. Run "npm install"
(node:8672) [DEP0018] DeprecationWarning: Unhandled promise rejections are depre
cated. In the future, promise rejections that are not handled will terminate the
 Node.js process with a non-zero exit code.

显示 chromium 未下载错误,因为 chromium 默认的下载路径是在 node_modules/puppeteer/.local-chromium/ 目录,这时候我们的 chromium 是在项目根目录,所以需要配置指定路径,修改 index.js 文件 ():

js
const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({
    executablePath: "./chromium/chrome.exe",
    headless: false,
  });
  const page = await browser.newPage();
  await page.goto("http://music.163.com/");
  await page.screenshot({ path: "music.png" });
  browser.close();
})();

puppeteer launch 参数说明:

  • executablePath: 运行 Chromium 或 Chrome 可执行文件的路径
  • headless: 是否运行在浏览器 headless 模式,true 为不打开浏览器执行,默认为 true
  • timeout: 等待浏览器实例启动的最长时间(以毫秒为单位)。默认为 30000(30 秒)。通过 0 禁用超时
  • args: 传递给浏览器实例的其他参数

更多参数请参照官网,再次执行 index.js 可能出现以下错误:

sh
Error: Protocol error (Page.getFrameTree): 'Page.getFrameTree' wasn 't found undefined

刚开始找了好久没找到答案,然后上万能的 Google 找了下,发现了类似的问题

alt

可能是 chromium 的版本存在差异,然后重新在 chromium 官网下载最新版本解压到项目(要注意下相应系统 chromium)

执行 index.js, 脚本运行 chromium 浏览器跳转到界面,截图保存到项目中,这样就成功了。

puppeteer 相关地址

puppeteer 神器官方文档,可以进行其他强大的功能开发。

最后编辑时间:

Version 4.2 (core-1.3.4)