pyppeteer使用常见问题及解决方案(转)

一、前言

以前使用selenium的无头浏览器,自从phantomjs2016后慢慢不更新了之后,selenium也开始找下家,这时候谷歌的chrome率先搞出来无头浏览器并开放了各种api,随后firefox也开始做。
现在selenium的测试也都支持这两个浏览器的无头模式了,只需要在引入的时候配置一下就可以了。之所以要采用谷歌chrome官方无头框架puppeteer的python版本pyppeteer,是因为有些网页是可以检测到是否是使用了selenium。并且selenium所谓的保护机制不允许跨域cookies保存以及登录的时候必须先打开网页然后后加载cookies再刷新的方式很不友好。

二、pyppeteer

github地址:https://miyakogi.github.io/pyppeteer/

pyppeteer这个项目是非官方的,是基于谷歌官方puppeteer的python版本。

注意:本来chrome就问题多多,puppeteer也是各种坑,加上pyppeteer是基于前者的改编python版本,也就是产生了只要前两个有一个有bug,那么pyppeteer就会原封不动的继承下来,本来这没什么,但是现在遇到的问题就是pyppeteer这个项目从18年9月份之后就没更新过了,前两者都在不断的更新迭代,而pyppeteer一直不更新,导致很多bug根本没人修复。

遇到的错误:

1)pyppeteer.errors.NetworkError: Protocol error Network.getCookies: Target close

控制访问指定url之后await page.goto(url),会遇到上面的错误,如果这时候使用了sleep之类的延时也会出现这个错误或者类似的time out。
这个问题是puppeteer的bug,但是对方已经修复了,而pyppeteer迟迟没更新,就只能靠自己了,搜了很多人的文章,例如:https://github.com/miyakogi/pyppeteer/issues/171 ,但是我按照这个并没有成功。
也有人增加一个函数,但调用这个参数依然没解决问题。

async def scroll_page(page):
cur_dist = 0
height = await page.evaluate("() => document.body.scrollHeight")
while True:
if cur_dist < height:
await page.evaluate(“window.scrollBy(0, 500);”)
await asyncio.sleep(0.1)
cur_dist += 500
else:
break

可以把python第三方库websockets版本7.0改为6.0就可以了,亲测可用。

pip uninstall websockets #卸载websockets
pip install websockets==6.0 #指定安装6.0版本

2)chromium浏览器多开页面卡死问题

解决这个问题的方法就是浏览器初始化的时候添加’dumpio’:True。

3)浏览器窗口很大,内容显示很小

上面的问题是需要设置浏览器显示大小,默认就是无法正常显示。可以看到页面左侧右侧都是空白,网站内容并没有完整铺满chrome.

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大小来实现网页完整显示。

但是对于那种向下无限加载的长网页这种情况如果浏览器是可见状态会显示不全,针对这种情况的解决方法就是复制当前网页新开一个标签页粘贴进去就正常了

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是 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 库的基本使用方法和一些示例代码,你可以根据自己的需求进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值