python接口自動化30-requests超時重試方法(由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗)


前言

"由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗",這是經常遇到的問題
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] 由於連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。',))
一般出現這個問題的原因是:host='www.github.com' 主機地址沒連上,使用 requests 發請求時,有些網站服務器不穩定,特別是國外的網站,經常會出現連接失敗情況。
連接失敗后,有時候會拋出上面異常,有時候會一直卡住,進入假死狀態,沒響應,也不會結束。

timeout

requests 發請求的時候會有個默認的超時時間,這個時間在20秒左右

import requests
# 上海-悠悠 QQ交流群:717225969


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 超時時間,達到這個請求超時時間就結束,如 15 秒超時。

import requests
# 上海-悠悠 QQ交流群:717225969


s = requests.session()

url = "https://www.github.com/"
r = s.request("GET", url=url, timeout=15)
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 0x000001CF6D2A4A20>, 'Connection to www.github.com timed out. (connect timeout=15)'))

失敗重試 max_retries

Requests 自帶了一個傳輸適配器,也就是 HTTPAdapter。 這個適配器使用了強大的 urllib3,為 Requests 提供了默認的 HTTP 和 HTTPS 交互。
每當 Session 被初始化,就會有適配器附着在 Session 上,其中一個供 HTTP 使用,另一個供 HTTPS 使用。

import requests
from requests.adapters import HTTPAdapter
s = requests.session()
# 上海-悠悠 QQ交流群:717225969


# max_retries=3 重試3次
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))


url = "https://www.github.com/"
r = s.request("GET", url=url, timeout=15)
print(r.text)

這樣每次請求超時15s,超時后會重試3次,最大請求時長45s.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM