国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python爬蟲URL重試機制的實現方法(python2.7以及python3.5)

2020-01-04 13:46:35
字體:
來源:轉載
供稿:網友

應用場景:

狀態不是200的URL重試多次

代碼比較簡單還有部分注釋

python2.7實現:

# -*-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會拋出HTTPError錯誤  request.raise_for_status()  html = request.content except requests.HTTPError as e:  html=None  if num_retries>0:   #如果不是200就重試,每次遞減重試次數   return url_retry(url,num_retries-1) #如果url不存在會拋出ConnectionError錯誤,這個情況不做重試 except requests.exceptions.ConnectionError as e:  return return html url_retry("http://httpbin.org/status/404")

python3.5實現:

# -*-coding:utf-8-*-"""ayou"""import asyncioimport 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會拋出HttpProcessingError錯誤    response.raise_for_status()    body = await response.text()  except aiohttp.errors.HttpProcessingError as e:   body = None   if num_retries > 0:     #如果不是200就重試,每次遞減重試次數    return await print_page(url, num_retries - 1)  #不存在URL會拋出ClientResponseError錯誤  except aiohttp.errors.ClientResponseError as e:   return e session.close() print(body) return body def main(): #這是一個不存在URL # url = 'http://httpbin.org/status/404111' #這是一個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()

爬蟲URL重試機制封裝成修飾器(python2.7以及python3.5以上)

python2.7版本:

# -*-coding:utf-8-*-"""ayou"""import requests #定義一個重試修飾器,默認重試一次def retry(num_retries=1): #用來接收函數 def wrapper(func):  #用來接收函數的參數  def wrapper(*args,**kwargs):   #為了方便看拋出什么錯誤定義一個錯誤變量   last_exception =None   #循環執行包裝的函數   for _ in range(num_retries):    try:     #如果沒有錯誤就返回包裝的函數,這樣跳出循環     return func(*args, **kwargs)    except Exception as e:     #捕捉到錯誤不要return,不然就不會循環了     last_exception = e   #如果要看拋出錯誤就可以拋出   # 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 #定義一個重試修飾器,默認重試一次def retry(num_retries=1): #用來接收函數 def wrapper(func):  #用來接收函數的參數  def wrapper(*args,**kwargs):   #為了方便看拋出什么錯誤定義一個錯誤變量   last_exception =None   #循環執行包裝的函數   for _ in range(num_retries):    try:     #如果沒有錯誤就返回包裝的函數,這樣跳出循環     return func(*args, **kwargs)    except Exception as e:     #捕捉到錯誤不要return,不然就不會循環了     last_exception = e   #如果要看拋出錯誤就可以拋出   # 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會拋出HttpProcessingError錯誤   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爬蟲URL重試機制的實現方法(python2.7以及python3.5)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到python教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长汀县| 泸水县| 扶余县| 滦南县| 宝鸡市| 邢台市| 和平县| 迁安市| 天长市| 永丰县| 平遥县| 和平区| 晴隆县| 东乡县| 灵武市| 上饶县| 龙州县| 手机| 左权县| 庆元县| 永顺县| 南充市| 江达县| 博白县| 五河县| 永仁县| 益阳市| 东源县| 德令哈市| 泰兴市| 泾源县| 承德县| 沅江市| 江西省| 科技| 定边县| 岑巩县| 方山县| 佛山市| 英超| 海宁市|