pyppeteer 弹出页面造成阻塞

一、问题场景

最近在使用 pyppeteer 采集数据的时候遇到一个新问题,在调用 page.goto() 函数时,页面突然跳出一个弹出窗口。

这个时候需要点击一下 确定 按钮,但是由于页面还在加载中,也就是 goto() 函数还在执行中,这个时候也就无法执行 js 去操作页面。

我的解决方式是直接读取页面的内容,不再等待页面加载完成。

但是在执行 page.content() 方法时,程序卡住,没有反应,但是这个函数没有 自带的 timeout 选项,所以我们要自己给他实现 timeout 功能以控制程序的最长执行时间。

二、解决方法

解决方式很简单,在 协程 里,官方已经给了一个控制程序执行时长的方法: asyncio.wait_for( aw , timeout , ***, loop=None )
使用 timeout 可以指定超时秒数,超时后会抛出异常 asyncio.TimeoutError

来看一下官网例子:

async def eternity():
    # Sleep for one hour
    await asyncio.sleep(3600)
    print('yay!')
async def main():
    # Wait for at most 1 second
        await asyncio.wait_for(eternity(), timeout=1.0)
    except asyncio.TimeoutError:
        print('timeout!')
asyncio.run(main())