中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python爬蟲URL重試機制的實現

發布時間:2021-06-03 16:21:56 來源:億速云 閱讀:124 作者:Leah 欄目:開發技術

python爬蟲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 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會拋出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重試機制的實現的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

江达县| 鹤峰县| 武功县| 霍城县| 沂南县| 通化县| 康马县| 苏尼特右旗| 且末县| 屯留县| 仁布县| 万年县| 渑池县| 彭阳县| 德州市| 北海市| 邛崃市| 工布江达县| 科技| 天水市| 怀远县| 朝阳县| 清河县| 桐乡市| 秦皇岛市| 瓮安县| 郧西县| 佳木斯市| 新乡市| 砀山县| 佛教| 泸溪县| 阿巴嘎旗| 册亨县| 绥中县| 楚雄市| 武鸣县| 天祝| 肥乡县| 镇沅| 塘沽区|