puppeteer 是一个 Chrome 官方出品的 headless Chrome node 库。它提供了一系列的 API, 可以在无 UI 的情况下调用 Chrome 的功能, 适用于爬虫、自动化处理等各种场景
Puppeteer 的安装很简单,主要复杂是 chromium 依赖的安装较为麻烦
安装
这里直接使用 npm 安装就行了,建一个简单的 node 项目,package.json 内容如下
{
"name": "node-d",
"version": "1.0.0",
"description": "",
"scripts": {},
"author": "",
"license": "ISC",
"dependencies": {
"puppeteer": "^1.20.0"
}
}
安装好后,chromium 也会一起安装,位置在node_modules/puppeteer/.local-chromium
。可以通过设置环境变量或者 npm config 中的 PUPPETEER_SKIP_CHROMIUM_DOWNLOAD 跳过下载。如果不下载的话,启动时可以通过 puppeteer.launch([options])
配置项中的 executablePath 指定 Chromium 的位置
测试
写段简单的代码看看能不能使用
const puppeteer = require('puppeteer')
const devices = require('puppeteer/DeviceDescriptors')
async function start() {
// root 用户启动需要添加沙箱参数
// args: ['--no-sandbox']
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox']
})
const page = await browser.newPage()
await page.emulate(devices['iPhone 6'])
await page.goto('https://baidu.com')
await page.screenshot({
path: new Date().getTime() + '.png',
fullPage: true
})
await browser.close()
}
start()
chromium 依赖安装
执行上面的代码报错,内容如下,大意就是缺少相关额库文件
error while loading shared libraries: libcups.so.2: cannot open shared object file: No such file or directory
根据库文件去反查在那个程序中。这里直接安装 cups-libs,记得去掉后面的版本号,不然子依赖不会安装
yum provides libcups.so.2
# 1:cups-libs-1.6.3-40.el7.i686 : CUPS printing system - libraries
# 源 :os
# 匹配来源:
# 提供 :libcups.so.2
yum install cups-libs
再启动还是缺少其他库文件,直接到 chromium 的执行文件下查询依赖
cd node_modules/puppeteer/.local-chromium/linux-686378/chrome-linux
ldd chrome | grep not
# libatk-bridge-2.0.so.0 => not found
# libpangocairo-1.0.so.0 => not found
# libpango-1.0.so.0 => not found
# libcairo.so.2 => not found
# libatspi.so.0 => not found
# libgtk-3.so.0 => not found
# libgdk-3.so.0 => not found
# libgdk_pixbuf-2.0.so.0 => not found
# 查找到缺少的so文件,同上反查询出安装包名
yum install atk pango at-spi2-atk gtk3
字体安装
经过一番折腾,依赖装完了,我们的测试代码运行成功,输出了一张图片,但是打开图片会发现字体全是方块,很明显是缺少中文字体的原因
直接安装 centos 下的字体包就行了,一般就够用了
yum groupinstall "fonts" -y