pyppeteer使用细节

原文链接

windows下使用puppeteer

1,安装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-chrome
baseurl=http://dl.google.com/linux/ch...$basearch
enabled=1
gpgcheck=1
gpgkey=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:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pyppeteer\launcher.py", line 201, in killChrome
    self._cleanup_tmp_user_data_dir()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python36\lib\site-packages\pyppeteer\launcher.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

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:'~/puppeteer/.local-chromium/linux-599821/chrome-linux/chrome',
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
  });

pyppeteer 浏览器类和websockets.protlcol类输出巨量日志解决办法

将pyppeteer类和websockets.protlcol类的log设置为WARNING级别,可以避免WARINIG级别下的log输出。此法,可以节省程序打印无用日志的时间和日志占用的巨大空间。

pyppeteer_level = logging.WARNING
logging.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上issue地址