python介面自動化(二十八) requests超時重試方法(由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗)
阿新 • • 發佈:2020-08-08
前言
“由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗”,這是經常遇到的問題requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.github.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x0000020F06524AC8>: Failed to establish a new connection: [WinError 10060] 由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗。',))
連線失敗後,有時候會丟擲上面異常,有時候會一直卡住,進入假死狀態,沒響應,也不會結束。
timeout
requests發請求的時候有個預設的超時時間,這個時間在20秒左右
import requests s=requests.session() url="https://www.github.com/" r=s.request("GET",url=url) print(r.text)
連不上伺服器會出現異常:requests.exceptions.ConnectionError
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.github.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x0000020F06524AC8>: Failed to establish a new connection: [WinError 10060] 由於連線方在一段時間後沒有正確答覆或連線的主機沒有反應,連線嘗試失敗。',))
如果請求一直沒響應,進入假死狀態,可以加個timeout超時時間,達到這個請求超時時間就結束,如0.1s超時
import requests s=requests.session() url="https://www.github.com/" r=s.request("GET",url=url,timeout=0.1) print(r.text)
這樣丟擲的異常是:requests.exceptions.ConnectTimeout
raise ConnectTimeout(e, request=request) requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='www.github.com', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.VerifiedHTTPSConnection object at 0x0000000003472358>, 'Connection to www.github.com timed out. (connect timeout=0.1)'))
失敗重試 max_retries
Requests自帶了一個傳輸介面卡,也就是HTTPAdapter。這個介面卡使用了強大的urllib3, 為Requests提供了預設的HTTP和HTTPS互動。
每當Session被初始化,就會有介面卡附著在Session上,其中一個供HTTP使用,另一個供HTTPS使用。
import requests from requests.adapters import HTTPAdapter s=requests.session() s.mount('http://',HTTPAdapter(max_retries=3))#重試3次 s.mount('https://',HTTPAdapter(max_retries=3)) url="https://www.github.com/" r=s.request("GET",url=url,timeout=0.1) print(r.text)
這樣每次請求超過0.1s,超過時,會重試3次,最大請求時長0.1s