請啟用JavaScript來查看內容

Requests 套件發生 requests.exceptions.SSLError: certificate verify failed 錯誤,無法請求網頁

    問題

    在使用 Requests 套件送出請求抓取網頁時,有時候可能會遇到以下錯誤:

    requests.exceptions.SSLError: HTTPSConnectionPool(host='www.xxx.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)'),))
    

    原因是 HTTPS 的 SSL 憑證過期、不合格或有其他問題,造成 Requests 在請求時證書驗證失敗,就會出現 requests.exceptions.SSLError 這樣的錯誤。

    憑證無效
    憑證無效

    解決辦法

    Requests 套件在默認的情況下,預設是啟用 SSL 驗證,其中一個解決的方式是透過加上 verify=False 參數來關閉 Requests 的 SSL 憑證檢查功能。

    1
    
    r = requests.get('https://www.xxx.com', verify=False)
    



    關閉 Requests 套件的 SSL 憑證檢查功能,就能正常取得網頁資料,但會跳出以下警告:

    InsecureRequestWarning: Unverified HTTPS request is being made to host 'www.xxx.com'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    

    雖然不影響結果,但如果覺得很礙眼想隱藏此警告消息,
    參考它給的網址(https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings),裡頭寫到"如果您了解風險並希望禁用這些警告,則可以使用 disable_warnings()":

    1
    2
    
    import urllib3
    urllib3.disable_warnings()
    

    或者也可以只針對不安全的請求警告隱藏:

    1
    2
    
    import urllib3
    urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    




    參考:
    Requests 套件 SSL Cert Verification
    urllib3 套件 TLS Warnings
    stackoverflow


    真正能讓你倒下的,不是對手,而是你絕望的內心。


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師