puppeteer – 通过DevTools协议操作Chrome

Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chrome 或 Chromium。
默认情况下是无头的,但是可以配置为运行完整的(非无头的) Chrome 或 Chromium。

功能

大多数你可以在浏览器中手动完成的事情都可以通过 Puppeteer 来完成:

  • 生成页面的截图和 pdf 文件。
  • 抓取一个 SPA (单页应用)并生成预渲染内容(例如“ SSR”(Server-Side Rendering))。
  • 自动化表单提交、 UI 测试、键盘输入等。
  • 创建一个最新的自动化测试环境。使用最新的 JavaScript 和浏览器特性,直接在最新版本的 Chrome 中运行测试。
  • 捕获站点的时间线跟踪,以帮助诊断性能问题。
  • 测试 Chrome 扩展

如何使用

npm i puppeteer
# or "yarn add puppeteer"

注意: 当你安装 Puppeteer 时,它会自动下载一个最新版本的 Chromium (~ 170mb Mac,~ 282mb Linux,~ 280mb Win) ,
这个版本可以保证可以与当前puppeteer完美结合。

若要跳过下载,请下载到另一个路径,或下载不同的浏览器,请参阅 环境变量

更多内容请参考官方文档:https://github.com/puppeteer/puppeteer/

使用docker部署

直接使用nodejs的镜像还是不行的,还需要安装chromium,这里给出两个Dockerfile,一个用来构建chromium镜像,
另一个基于第一个镜像构建rendertron(rendertron是基于puppeteer的动态渲染工具,仍有参考价值):

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM alpine

# Installs latest Chromium (92) package.
RUN apk update && apk add --no-cache \
      chromium \
      nss \
      freetype \
      harfbuzz \
      ca-certificates \
      ttf-freefont \
      nodejs \
      npm \
      yarn

rendertron源码根目录新建Dockerfile(puppeteer应该是适用的)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM node-chromium:v0.2

ENV TZ=Asia/Shanghai

RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ >/etc/timezone

# 告诉puppeteer跳过安装Chrome过程,直接使用安装包
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \
    PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser

WORKDIR /home/

ADD ./ /home/
RUN npm i --registry https://registry.npm.taobao.org && npm cache clean --force
RUN npm i --only=prod

EXPOSE 3000

CMD ["node", "./bin/rendertron"]

Q&A

pyppeteer.errors.NetworkError: Protocol Error (Runtime.callFunctionOn): Session closed. Most likely the page has been closed.

几种解决方案:

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注