如果只是使用
npm i puppeteer
来做安装,应该会一步到位。奈何因为墙的关系,不得不把一个自动化的东西给拆解了,理解其中每一步的细节,具体解决每一个细小的问题。
首先安装 nodejs
和 npm
,国内的可以通过安装 cnpm
来加快速度。
接下来,按照习惯应该是通过 npm i puppeteer
来安装 puppeteer
。但,坑出现了,你会得到错误提示:
或者
ERROR: Failed to download Chromium r515411! Set "PUPPETEER_SKIP_CHROMIUM_DOWNLOA
D" env variable to skip download.
执行 node install.js
失败。为什么会失败呢?因为这个文件里做了一个重要的工作,就是下载Chromium,去官方下载。。。于是你懂的,伟大的墙让它自然失败了。
于是一个解决办法是忽略这个脚本的执行:npm i --save puppeteer --ignore-scripts
。由于这里忽略了 Chromium 的下载,自然在后面的时候,你需要回来补上这个锅。
新建 example.js
这个文件,
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
直接执行 node example.js
,执行下载。此时,可能会出现如下错误:
(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没有被下载,无法执行。
从官网 https://download-chromium.appspot.com/ 进行下载(或者下载taobao镜像https://npm.taobao.org/mirrors/chromium-browser-snapshots/linux_x64/),选择好你的服务器操作系统版本。下载时,注意Chromium的版本号:
解压后,放在 <proj_dir>/node_modules/puppeteer/
。将上述 example.js
文件加上执行路径:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
executablePath: '<proj_dir>/node_modules/puppeteer/chrome-linux/chrome',
});
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({path: 'example.png'});
await browser.close();
})();
修改 <proj_dir>/node_modules/puppeteer/package.json
文件,修改 Chromium 的版本号:
此时再执行 node example.js
应该会成功。
如果截图成功,但是却发现截图中充满了各种方块的中文乱码,那是因为 Chromium-browser
无法渲染出中文字体,需要安装系统字体:
sudo apt-get install ttf-wqy-microhei ttf-wqy-zenhei xfonts-wqy