python 使用 retrying 重試請求

鍾森龍 發表於 2019-08-22

當我們用 request 發起網路請求,時不時會遇到超時,當然不可能讓這個請求一直阻塞,一般會設定一個超時時間,用 try except 丟擲異常,避免程式中斷。可如果一次超時就放棄該請求,誤殺的概率會很大,我們日常訪問某網站時,有打不開的情況都會多重新整理幾次。因此,我們也需要讓 python 進行重試。而 retrying 模組應運而生

retrying 的安裝很簡單,用 pip 一鍵安裝:

pip install retrying

為了表現 retrying 的重試功能,我們故意請求一個不規範的連結,如 www.baidu.com ,由於沒有帶 http 協議,request 會報錯,從而觸發 retrying 重試

程式碼如下:

import requests
from retrying import retry

headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"
}

@retry(stop_max_attempt_number=3) # 表示重試以下程式碼三次
def _parse_url(url):
    print("-" * 30)
    response = requests.get(url, headers=headers, timeout=3)
    assert response.status_code == 200
    return response.content.decode()

def parse_url(url):
    try:
        html_str = _parse_url(url)
    except:
        html_str = None
    return html_str

if __name__ == "__main__":
    url = 'www.baidu.com'
    print(parse_url(url))

結果如下:

------------------------------
------------------------------
------------------------------
None

說明,retry 在遇到異常後會重試執行,直到給定的最大重試次數