Python如何優(yōu)雅的設(shè)置爬蟲重試次數(shù)
Python如何優(yōu)雅的設(shè)置爬蟲重試次數(shù)
工作中經(jīng)常碰到的問題就是,當(dāng)我們?cè)谑褂门老x發(fā)送請(qǐng)求的時(shí)候。某個(gè)方法出現(xiàn)了異常,重試幾次循環(huán)重復(fù)一個(gè)方法是很常見的。一提到重復(fù)操作,我們第一反應(yīng)就是使用循環(huán)。接下來咱們用while看一下示例代碼:
import?requests url?="www.baidu.com" i=0 total=2000 while?i?<?total: ????try: ????????result=requests.get(url) ????????return?result.status_code ????except: ????????i+=1
在代碼外面在加一層循環(huán)。這個(gè)代碼看起來已經(jīng)不是丑的問題了。那接下來我們使用一個(gè)優(yōu)雅的方式。python retrying模塊。retrying是一個(gè)python的重試包,可以用來自動(dòng)重試一些可能運(yùn)行失敗的程序段,retrying提供一個(gè)裝飾器函數(shù)retry,被裝飾的函數(shù)就會(huì)在運(yùn)行失敗的情況下重新執(zhí)行,默認(rèn)只要一直報(bào)錯(cuò)就會(huì)不斷重試。首先安裝一下
pip?install?retrying
下面是示例代碼:
from?retrying?import?retry @retry(stop_max_attempt_number=2000) def?test(): ????url?="www.baidu.com" ????result=requests.get(url) ????return?result.status_code test()
我們?cè)瓉淼拇a沒有進(jìn)行任何修改,只是說在這個(gè)函數(shù)之前,我們加上了這么一個(gè)裝飾器這樣看起來是不是很優(yōu)雅。那除此之外,我們還可以設(shè)置retrying其他的參數(shù)
重試之間等待 2 秒。
@retry(wait_fixed=2000) ?def?test(): ?????url?="www.baidu.com" ?????result=requests.get(url) ?????return?result.status_code ?test()
stop_max_delay 設(shè)置失敗重試的最大時(shí)間, 單位毫秒,超出時(shí)間,則停止重試
@retry(stop_max_delay?=1000) def?test(): ????url?="www.baidu.com" ????result=requests.get(url) ????return?result.status_code test()
兩次retrying之間的停留最短時(shí)間wait_random_mint和兩次retrying之間的停留最長時(shí)間wait_random_max
?@retry(wait_random_min=100,?wait_random_max=2000) ?def?test(): ??????url?="www.baidu.com" ??????result=requests.get(url) ??????return?result.status_code ??test() ?```
wait_exponential_multiplier間隔時(shí)間倍數(shù)增加,wait_exponential_max最大間隔時(shí)間
@retry(wait_random_min=100,?wait_random_max=2000) def?test(): ????print("test?%d"?%?int(time())) ????url?="www.baidu.com" ????result=requests.get(url) ????return?result.status_code test()
其它參數(shù)咱們可以看?官方文檔