之前开发了一个爬虫项目,需要用到requests_html在本地html页面渲染js,执行一些加密解密操作,在linux运行时候的坑真的多得很。 另外,最近换服务器,想把项目放在docker里,在这里对 Pyppeteer 打包 Docker 的坑简单做一下总结。
概述
Pyppeteer 打包 Docker 主要是有这么几个坑点:
依赖没有安装,导致无法正确安装和启动 Pyppeteer。
没有关闭沙盒模式,导致可能出现 Browser closed unexpectedly 错误•没有提前安装好 Pyppeteer,导致每次启动时都要重新安装
安装依赖
首先说第一个,安装依赖。
因为 Docker 大部分都是基于 Linux 系统的,比如我常用的基础镜像就是 python:3.7,属于 Debian 系列,当然还有很多其他的版本,具体可以查看 https://hub.docker.com/_/python 了解下。
但是对于 Pyppeteer 来说,python:3.7 内置的依赖库并不够,我们还需要额外进行安装,安装完毕之后还需要清空下 apt list,一句 Dockerfile 命令如下:
apt-get update && \
apt-get -y install libnss3 xvfb gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 \
libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 \
libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 \
libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 \
libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget && \
rm -rf /var/lib/apt/lists/*
关闭沙盒模式
在 Docker 中如果直接启动 Pyppeteer,我们还需要关闭沙盒模式,否则可能会遇到如下错误:
pyppeteer.errors.BrowserError: Browser closed unexpectedly:
[0924/153706.301300:ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180
这里提示我们要关闭沙盒模式,requests_html默认是关闭的。没有的话这里只需要在启动 Pyppeteer 的时候,给 launch 方法的 args 参数多加一个 --no-sandbox 即可,写法如下:requests_html.py内