共计 3254 个字符,预计需要花费 9 分钟才能阅读完成。
windows 下使用 puppeteer1,安装 puppeteer 的 python 库 pyppeteer
pip install pyppeteer
2,安装 chromium 第一次运行 pyppeteer 就会自动安装 chromium。
centos 安装 puppeteer
windows 上安装 puppeteer 非常的简单,只要安装了 chrome 浏览器,直接就可以运行,但在 CentOS 上却没那么简单了,需要处理一大堆的依赖程序,所以把这个过程记录下来,方便以后查阅。注意:Chrome 已不再支持 CentOS 6,所以要么升级到 CentOS 7 或改用 FireFox(据说也不再支持 CentOS6 了,而且也不兼容 Puppeteer)。
安装 puppeteer npm 包由于防火墙的原因,我们不能直接访问 google,在安装 puppeteer npm 包时,下载 chromium 的时候就会报错。
ERROR: Failed to download Chromium r543305! Set “PUPPETEER_SKIP_CHROMIUM_DOWNLOAD” env variable to skip download.{Error: connect ETIMEDOUT 172.217.160.112:443
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1173:14)
errno: ‘ETIMEDOUT’, code: ‘ETIMEDOUT’, syscall: ‘connect’, address: ‘172.217.160.112’, port: 443 } 所以要使用镜像安装,输入以下命令即可切换到镜像下载:
npm config set puppeteer_download_host=https://storage.googleapis.co… 如果上面镜像坏了,报 404,可以试一下下面这个:
npm config set puppeteer_download_host=https://npm.taobao.org/mirror 然后像往常一样安装就可以了。
npm i puppeteer –save 安装依赖包如果直接运行,就会产生下面错误:
/some/path/root/node_modules/puppeteer/.local-chromium/linux-543305/chrome-linux/chrome: error while loading shared libraries: libXss.so.1: cannot open shared object file: No such file or directory… 所以我们需要安装依赖包,幸运的是 yum 里已经有相应的包,所以命令很简单:
sudo yum install google-chrome-stable 如果提示没有这个包,那就需要添加 google 的源来下载,如果没法访问 google,那就需要找个镜像了,把下面的 url 替换成镜像的即可,添加文件 /etc/yum.repo.d/google-chrome.repo:
[google-chrome]name=google-chromebaseurl=http://dl.google.com/linux/ch…$basearchenabled=1gpgcheck=1gpgkey=https://dl-ssl.google.com/lin… 如果无法下载 gpgkey,可以把 gpgcheck 的值改为 0(如果你不介意安全问题),再运行一次 yum 的安装命令即可。
关闭沙盒模式你以为这样就可以了?哈哈,图样图深破,你尝试运行还会有一个 sandbox 的错误,如果你的环境是暴露的,建议按官方教程加上沙盒运行,否则像我这样直接关闭就行,只要在 js 代码中加上一个 no-sandbox 的参数即可。
const browser = await puppeteer.launch({args: [‘–no-sandbox’]}); 字体缺失某些服务器默认字体是不全的,需要手动安装,如果出现类似以下错误就需要装字体:
[0427/123834.275317:FATAL:platform_font_linux.cc(83)] Check failed: InitDefaultFont(). Could not find the default font 安装方法很简单,就用 yum 就可以:
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc - y 到这里,你的 puppeteer 应该就可以了~
OSError: Unable to remove Temporary User Data
Error in atexit._run_exitfuncs:Traceback (most recent call last): File “C:UsersAdministratorAppDataLocalProgramsPythonPython36libsite-packagespyppeteerlauncher.py”, line 201, in killChrome
self._cleanup_tmp_user_data_dir()
File “C:UsersAdministratorAppDataLocalProgramsPythonPython36libsite-packagespyppeteerlauncher.py”, line 130, in _cleanup_tmp_user_data_dir
raise IOError(‘Unable to remove Temporary User Data’)
OSError: Unable to remove Temporary User Data
忘记关闭页面导致的错误,await page.waitFor(3000)await page.close()
pyppeteer.errors.BrowserError: Failed to connect to browser port:http://127.0.0.1:59000/json/version
启动时添加 –disable-setuid-sandbox 选项
const browser = await puppeteer.launch({
headless: true,
executablePath:’/home/sagar/workplace/scraping-demo/node_modules/puppeteer/.local-chromium/linux-599821/chrome-linux/chrome’,
args: [‘–no-sandbox’, ‘–disable-setuid-sandbox’],
});
将 pyppeteer 类和 websockets.protlcol 类的 log 设置为 WARNING 级别, 可以避免 WARINIG 级别下的 log 输出。此法,可以节省程序打印无用日志的时间和日志占用的巨大空间。
pyppeteer_level = logging.WARNINGlogging.getLogger(‘pyppeteer’).setLevel(pyppeteer_level)logging.getLogger(‘websockets.protocol’).setLevel(pyppeteer_level)
pyppeteer_logger = logging.getLogger(‘pyppeteer’)pyppeteer_logger.setLevel(logging.WARNING)
在 github 上崔大佬开了 issue,讨论避免 pyppeteer 类和 websockets.protlcol 类打印大量日志的问题。github 地址