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.
几种解决方案:
- 如果是部署在docker,增加虚拟机配置,本人是这种情况,增加配置后,运行良好
- 找到pyppeteer包下的connection.py模块,修改:
1 2 3
self._ws = websockets.client.connect( #self._url, max_size=None, loop=self._loop) self._url, max_size=None, loop=self._loop, ping_interval=None, ping_timeout=None)
- https://github.com/miyakogi/pyppeteer/issues/178
- https://github.com/miyakogi/pyppeteer/pull/160/files