python爬蟲(chóng)URL重試機(jī)制的實(shí)現(xiàn)方法(python2.7以及python3.5)
應(yīng)用場(chǎng)景:
狀態(tài)不是200的URL重試多次
代碼比較簡(jiǎn)單還有部分注釋
python2.7實(shí)現(xiàn):
# -*-coding:utf-8-*- """ ayou """ import requests def url_retry(url,num_retries=3): print("access!") try: request = requests.get(url,timeout=60) #raise_for_status(),如果不是200會(huì)拋出HTTPError錯(cuò)誤 request.raise_for_status() html = request.content except requests.HTTPError as e: html=None if num_retries>0: #如果不是200就重試,每次遞減重試次數(shù) return url_retry(url,num_retries-1) #如果url不存在會(huì)拋出ConnectionError錯(cuò)誤,這個(gè)情況不做重試 except requests.exceptions.ConnectionError as e: return return html url_retry("http://httpbin.org/status/404")
python3.5實(shí)現(xiàn):
# -*-coding:utf-8-*- """ ayou """ import asyncio import aiohttp async def print_page(url,num_retries=3): async with aiohttp.ClientSession() as session: try: async with session.get(url,timeout=60) as response: print("access!") #raise_for_status(),如果不是200會(huì)拋出HttpProcessingError錯(cuò)誤 response.raise_for_status() body = await response.text() except aiohttp.errors.HttpProcessingError as e: body = None if num_retries > 0: #如果不是200就重試,每次遞減重試次數(shù) return await print_page(url, num_retries - 1) #不存在URL會(huì)拋出ClientResponseError錯(cuò)誤 except aiohttp.errors.ClientResponseError as e: return e session.close() print(body) return body def main(): #這是一個(gè)不存在URL # url = 'http://httpbin.org/status/404111' #這是一個(gè)404的URL url = 'http://httpbin.org/status/404' loop = asyncio.get_event_loop() loop.run_until_complete(print_page(url)) loop.close() if __name__ == '__main__': main()
爬蟲(chóng)URL重試機(jī)制封裝成修飾器(python2.7以及python3.5以上)
python2.7版本:
# -*-coding:utf-8-*- """ ayou """ import requests #定義一個(gè)重試修飾器,默認(rèn)重試一次 def retry(num_retries=1): #用來(lái)接收函數(shù) def wrapper(func): #用來(lái)接收函數(shù)的參數(shù) def wrapper(*args,**kwargs): #為了方便看拋出什么錯(cuò)誤定義一個(gè)錯(cuò)誤變量 last_exception =None #循環(huán)執(zhí)行包裝的函數(shù) for _ in range(num_retries): try: #如果沒(méi)有錯(cuò)誤就返回包裝的函數(shù),這樣跳出循環(huán) return func(*args, **kwargs) except Exception as e: #捕捉到錯(cuò)誤不要return,不然就不會(huì)循環(huán)了 last_exception = e #如果要看拋出錯(cuò)誤就可以拋出 # raise last_exception return wrapper return wrapper if __name__=="__main__": @retry(5) def url_retry(url): request = requests.get(url, timeout=60) print("access!") request.raise_for_status() html = request.content print(html) return html url_retry("http://httpbin.org/status/404") # url_retry("http://httpbin.org/status/404111") # url_retry("http://www.baidu.com")
python3.5以上版本:
# -*-coding:utf-8-*- """ ayou """ import aiohttp,asyncio #定義一個(gè)重試修飾器,默認(rèn)重試一次 def retry(num_retries=1): #用來(lái)接收函數(shù) def wrapper(func): #用來(lái)接收函數(shù)的參數(shù) def wrapper(*args,**kwargs): #為了方便看拋出什么錯(cuò)誤定義一個(gè)錯(cuò)誤變量 last_exception =None #循環(huán)執(zhí)行包裝的函數(shù) for _ in range(num_retries): try: #如果沒(méi)有錯(cuò)誤就返回包裝的函數(shù),這樣跳出循環(huán) return func(*args, **kwargs) except Exception as e: #捕捉到錯(cuò)誤不要return,不然就不會(huì)循環(huán)了 last_exception = e #如果要看拋出錯(cuò)誤就可以拋出 # raise last_exception return wrapper return wrapper async def print_page(url): async with aiohttp.ClientSession() as session: async with session.get(url,timeout=60) as response: print("access!") #raise_for_status(),如果不是200會(huì)拋出HttpProcessingError錯(cuò)誤 response.raise_for_status() body = await response.text() session.close() print(body) return body @retry(5) def loop_get(): # url = "http://www.baidu.com" # url = 'http://httpbin.org/status/404111' url = 'http://httpbin.org/status/404' loop = asyncio.get_event_loop() loop.run_until_complete(print_page(url)) loop.close() if __name__ == '__main__': loop_get()
以上這篇python爬蟲(chóng)URL重試機(jī)制的實(shí)現(xiàn)方法(python2.7以及python3.5)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
深入探索Django中間件的應(yīng)用場(chǎng)景
Django中間件是一種可插拔的應(yīng)用程序組件,可在請(qǐng)求和響應(yīng)處理過(guò)程中修改Django的行為。中間件可用于處理請(qǐng)求、響應(yīng)、異常等,還可用于實(shí)現(xiàn)身份驗(yàn)證、緩存、性能監(jiān)控等常用功能。通過(guò)深入探索中間件的應(yīng)用場(chǎng)景,可以提高Django應(yīng)用程序的可擴(kuò)展性和靈活性2023-05-05python?離散點(diǎn)圖畫(huà)法的實(shí)現(xiàn)
本文主要介紹了python?離散點(diǎn)圖畫(huà)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04Python實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python和Pygame實(shí)現(xiàn)GIF動(dòng)圖加載和降幀的效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-02-02零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟
這篇文章主要介紹了零基礎(chǔ)學(xué)習(xí)python偏函數(shù)語(yǔ)法的推導(dǎo)方法步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Python學(xué)習(xí)筆記之While循環(huán)用法分析
這篇文章主要介紹了Python學(xué)習(xí)筆記之While循環(huán)用法,結(jié)合具體實(shí)例形式分析了while循環(huán)的原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08python實(shí)現(xiàn)列車(chē)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)列車(chē)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-09-09