当前位置 博文首页 > wang785994599的博客:pyppeteer使用常见问题及解决方案(转)

    wang785994599的博客:pyppeteer使用常见问题及解决方案(转)

    作者:[db:作者] 时间:2021-09-06 18:55

    一、前言

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

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

    cs