pyppeteer使用时常见的bug及解决办法

背景

最近时不时的会用到pyppeteer,一会儿是本地环境利用pyppeteer写个模拟浏览器的小脚本,一会儿是线上阿里云服务器上需要部署pyppeteer所写的脚本。中途遇到一些问题,最后都是通过goolge解决了。为了以后不再到处google,故写下此博客。

问题一

pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close 或者
pyppeteer.errors.NetworkError: Protocol Error (Runtime.evaluate): Session closed. Most likely the page has been closed.
后来有人说可以把python第三方库websockets版本7.0改为6.0(反正在7.0版本以下就)就可以了,亲测可用。

pip3.6 uninstall websockets #卸载websockets
pip3.6 install websockets==6.0 #指定安装6.0版本```

问题二

chromium浏览器多开页面卡死问题
在浏览器初始化的时候launch里添加 ‘dumpio’:True。跟浏览器进程有关,至于为什么要这样我也不太清楚。

问题三

浏览器窗口很大,但是内容很小
上面的问题是需要设置浏览器显示大小,默认就是无法正常显示。

在这里插入图片描述
可以看到gmail页面只在左侧显示,右侧都是空白,网站内容并没有完整铺满chromium,底部横向滚动条拖拽还很不方便。

browser = await launch({'headless': False,'dumpio':True, 'autoClose':False,'args': ['--no-sandbox', '--window-size=1366,850']})
await page.setViewport({'width':1366,'height':768})

通过上面设置Windows-size和Viewport大小来实现网页完整显示。
但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了。

问题四

运行时,屏幕终端有很多不相关的日志打印
下面是帖子https://segmentfault.com/a/1190000018873537 解决办法
将pyppeteer类和websockets.protlcol类的log设置为WARNING级别,可以避免WARINIG级别下的log输出。此法,可以节省程序打印无用日志的时间和日志占用的巨大空间。

import logging
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)

问题五

程序首次运行时,会自动下载chromium,但是下载报错,提示ssl错误

[W:pyppeteer.chromium_downloader] start chromium download. Download may take a few minutes. HTTPSConnectionPool(host=‘storage.googleapis.com’, port=443): Max retries exceeded with url: /chromium-browser-snapshots/Win_x64/575458/chrome-win32.zip (Caused by SSLError(SSLError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)’),))
解决办法:打开 /some/path/python3.6/lib/site-packages/pyppeteer/chromium_downloader.py,替换里面DEFAULT_DOWNLOAD_HOST = 'https://storage.googleapis.com’为DEFAULT_DOWNLOAD_HOST = 'http://storage.googleapis.com’即可,具体路径替换成自己的python路径。

问题六

pyppeteer.errors.NetworkError: Protocol error Runtime.evaluate: Target close
打开新标签页遇到的,解决办法根据https://github.com/miyakogi/pyppeteer/pull/160/files 这个文件进行更改pyppeteer包里面的connection.py文件即可。
在这里插入图片描述

问题七

在 centos系统中,首次运行pyppeteer会自动下载chromium,但是下载运行的过程中会报错:
/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

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的安装命令即可。

然后,chromium就可以正常下载了。

参考 一:https://www.sanfenzui.com/pyppeteer-bug-collection.html
参考二:https://segmentfault.com/a/1190000018873537

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
好的,以下是 Pyppeteer 库的使用方法及示例代码: 1. 安装 Pyppeteer 库 ``` pip install pyppeteer ``` 2. 导入库并创建浏览器对象 ```python import asyncio from pyppeteer import launch async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') await browser.close() asyncio.get_event_loop().run_until_complete(main()) ``` 这段代码中,我们首先导入 asyncio 和 launch 函数。使用 launch 函数可以创建一个浏览器对象,然后我们使用它创建了一个新的页面对象,并跳转到了 example.com 网站。最后,我们关闭浏览器对象。 3. 等待元素加载完成 ```python import asyncio from pyppeteer import launch async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') await page.waitForSelector('#main') await browser.close() asyncio.get_event_loop().run_until_complete(main()) ``` 在这个例子中,我们在跳转到 example.com 网站后,等待了一个名为 main 的元素加载完成,然后关闭浏览器对象。 4. 获取元素内容 ```python import asyncio from pyppeteer import launch async def main(): browser = await launch() page = await browser.newPage() await page.goto('https://example.com') content = await page.content() print(content) await browser.close() asyncio.get_event_loop().run_until_complete(main()) ``` 在这个例子中,我们首先跳转到 example.com 网站,然后使用 content() 方法获取页面的 HTML 内容,并打印输出。最后,我们关闭了浏览器对象。 以上是 Pyppeteer 库的基本使用方法和一些示例代码,你可以根据自己的需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值