一抛姑、問(wèn)題場(chǎng)景
最近在使用pyppeteer
采集數(shù)據(jù)的時(shí)候遇到一個(gè)新問(wèn)題,在調(diào)用 page.goto()
函數(shù)時(shí)慷暂,頁(yè)面突然跳出一個(gè)彈出窗口。
這個(gè)時(shí)候需要點(diǎn)擊一下確定
按鈕晨雳,但是由于頁(yè)面還在加載中行瑞,也就是goto()
函數(shù)還在執(zhí)行中奸腺,這個(gè)時(shí)候也就無(wú)法執(zhí)行 js
去操作頁(yè)面。
我的解決方式是直接讀取頁(yè)面的內(nèi)容血久,不再等待頁(yè)面加載完成突照。
但是在執(zhí)行 page.content()
方法時(shí),程序卡住氧吐,沒(méi)有反應(yīng)讹蘑,但是這個(gè)函數(shù)沒(méi)有 自帶的timeout
選項(xiàng),所以我們要自己給他實(shí)現(xiàn) timeout
功能以控制程序的最長(zhǎng)執(zhí)行時(shí)間副砍。
二衔肢、解決方法
解決方式很簡(jiǎn)單,在協(xié)程
里豁翎,官方已經(jīng)給了一個(gè)控制程序執(zhí)行時(shí)長(zhǎng)的方法:asyncio.wait_for(aw, timeout, ***, loop=None)
使用 timeout
可以指定超時(shí)秒數(shù)角骤,超時(shí)后會(huì)拋出異常asyncio.TimeoutError
來(lái)看一下官網(wǎng)例子:
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!
所以很簡(jiǎn)單的,這樣我們?cè)谑褂?pyppeteer 遇到可能會(huì)超時(shí)任務(wù)時(shí)候心剥,在放在asyncio.wait_for()
里面執(zhí)行就好了