Puppeteer 是一个由 Chrome 团队开发的 Node 库。它提供了一个高层次的 API 来控制无需显示版(或 完全版)的 Chrome。它与其他自动化测试库,如 Phantom 和 NightmareJS 相类似,但是只适用于最新版本的 Chrome。安装puppeteer前需要在系统上安装nodejs与npm;安装完puppeteer,默认会自动安装最新版本的chromium。系统默认安装的npm与nodejs版本都很低,而使用puppeteer需要node6.4.0+,async/await需要node7.6.0+ 。

一、nodejs与npm的安装

nodejs与npm的关系有点类似于redhat系统与yum的关系,npm就是node的包管理工具,默认系统源里带的版本太低了,直接给出官方源安装步骤。

1wget https://nodejs.org/dist/v12.16.1/node-v12.16.1-linux-x64.tar.xz
2tar Jxvf node-v12.16.1-linux-x64.tar.xz
3mv node-v12.16.1-linux-x64 /usr/local/nodejs
4ln -s /usr/local/nodejs/bin/npm /usr/local/bin/npm
5ln -s /usr/local/nodejs/bin/node /usr/local/bin/node

安装完成后使用node -v 和 npm -v 查看版本信息,网速不给力的可以使用国内下载点:https://npm.taobao.org/mirrors/node/v12.16.1/ 。这里默认使用的包源还是官方的,会比较慢,这里换用国内的taobao源,操作命令为:

1npm config set registry=http://registry.npm.taobao.org

使用npm config list 或 npm config get registry 获取当前源信息。

如果有多个版本需要来回切换,可以使用nvm进行版本管理。

二、puppeteer 安装

这个安装步骤比较简单,就跟直接yum操作类似,几条命令就搞定:

1mkdir puppeteer_test # 创建一个项目目录
2cd puppeteer_test
3npm init
4npm i --save puppeteer

在此安装过程中,可能会遇到chromium安装失败的情况(原因你懂的,受到方校长一万点的暴击),报信息为:

1ERROR: Failed to download Chromium r722234! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOAD" env variable to skip download.
2Error: EACCES: permission denied, mkdir '/data/puppeteer_test/node_modules/puppeteer/.local-chromium'

puppeteer-chromium
puppeteer-chromium

此时有三个解决方法:

一是安装chrome,通过参数调整跳过chromium的安装,但其会要求版本匹配;

二是手动安装chromium,根据报错的信息,到taobao源上下载后解压到指定位置,下载地址:https://npm.taobao.org/mirrors/chromium-browser-snapshots/ ;

三是使用taobao定制的cnpm工具,安装操作方式如下:

1npm install -g cnpm --registry=https://registry.npm.taobao.org
2ln -s /usr/local/nodejs/lib/node_modules/cnpm/bin/cnpm /usr/local/bin/cnpm

你马爸爸果然还是你爸爸,简单快速高效。

该问题解决参看:https://github.com/puppeteer/puppeteer/issues/1597

三、代码测试

这里使用截图测试代码,具体内容如下:

1const puppeteer = require('puppeteer');
2(async () => {
3  const browser = await puppeteer.launch();
4  const page = await browser.newPage();
5  await page.goto('https://blog.361way.com');
6  await page.screenshot({path: 'example.png'});
7  await browser.close();
8})();

使用node example.js执行后,仍旧报错,内容如下:

1(node:37158) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process!
2[0318/141911.157972:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

解决方法为修改browser定义行为:

1const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});

具体解决方法可以参看:https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md

当然,除此之外可能还会遇到中文乱码的问题,安装中文字体即可解决。

另外英文不好的,也可以查看中文文档: https://zhaoqize.github.io/puppeteer-api-zh_CN/