一、问题场景
最近在使用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
try:
await asyncio.wait_for(eternity(), timeout=1.0)
except asyncio.TimeoutError:
print('timeout!')
asyncio.run(main())
# Expected output:
#
# timeout!
所以很简单的,这样我们在使用 pyppeteer 遇到可能会超时任务时候,在放在asyncio.wait_for()
里面执行就好了
网友评论