在 Python 請求中實現超時
- 在 Python 中為 URL 實現超時
- 使用 Python 中的請求模組在多個 URL 上實現超時
-
在超時引數中設定
None
以在 Python 請求中實現超時 - 實現超時以替代 Python 請求
- まとめ
本文介紹如何在 Python 請求中實現超時。
在從連線中獲取資料時,超時必須在 request.get()
中放置一個計時器。如果連線花費的時間超過超時引數內所需的閾值,則 request.get()
會超時。
下面的示例解釋了使用語法 requests.get()
為 Python 請求實現超時的不同方法。
在 Python 中為 URL 實現超時
該程式演示了使用 GET
從 URL 獲取響應並在其中實現超時的方法。
-
匯入 Python 庫
requests
。 -
定義一個
try
塊。 -
在
try
塊中,宣告一個變數req
以儲存來自所需 URL 的請求並設定超時引數。 -
設定超時引數後,列印
req
檢視響應。 -
在
except
塊內,如果程式沒有收到任何響應並列印訊息,則設定異常。
try-except
塊是一個異常處理塊,它讓程式執行一個函式並在出現異常時設定一個替代方案。
在這裡,程式連線到 URL https://www.google.com
並執行 GET
命令。GET
命令從連線中獲取響應,對於成功的連線,通常是 <Response [200]>
。
語法 timeout=(1)
告訴程式如果沒有收到響應,則在 1 秒後超時連線。
例子:
import requests
try:
req = requests.request("GET", "https://www.google.com", timeout=(1))
print(req)
except requests.ReadTimeout:
print("READ TIME OUT")
輸出:
"C:\Users\Win 10\main.py"
<Response [200]>
Process finished with exit code 0
使用 Python 中的請求模組在多個 URL 上實現超時
此示例演示了同時從多個 URL 獲取響應的方法。在這個程式中,隨著獲取響應,超時引數將使用元組實現;例如,(x,y)
是一個元組。
超時可以設定為讀取和連線中的元組,在程式內部單獨指定。
timeout=(1,3)
表示連線計時器為 1 秒,讀取計時器為 3 秒。
必須注意,給定的超時將應用於所有 URL。如果不同的 URL 需要不同的超時,程式應該包含 request.get()
函式,用於計算各種超時的次數。
-
匯入庫包
requests
和urllib3
。urllib3
處理程式嘗試連線到防火牆無法識別的域時由網際網路防火牆引起的異常。下面的語法禁用程式連線到不安全網站時出現的警告。
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
-
在
try
塊內,初始化變數websites
以儲存多個域。 -
為變數
website
中存在的物件數量執行for
迴圈w
。 -
初始化變數
r
以儲存request.get()
響應並指定超時(3,3)
。驗證網站 TLS 證書的檢查。它被賦予一個
false
值以避免異常丟擲。 -
列印變數
r
。 -
在
except
塊中,將超時異常儲存在e
中並列印。例子:
import requests as requests import urllib3 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) try: websites = ["https://github.com", "https://www.google.com", "https://1337xto.to"] for w in websites: r = requests.get(w, verify=False, timeout=(3, 3)) print(r) except requests.exceptions.Timeout as e: print(e)
該程式嘗試連線到三個 URL。成功連線到前兩個後,程式會列印響應。
在第三個 URL 中,由於 URL 需要超過 6 秒才能返回響應,因此程式會引發超時異常。
輸出:
"C:\Users\Win 10\main.py" <Response [200]> <Response [200]> HTTPSConnectionPool(host='1337xto.to', port=443): Max retries exceeded with url: / (Caused by ConnectTimeoutError(<urllib3.connection.HTTPSConnection object at 0x0000022B3A202940>, 'Connection to 1337xto.to timed out. (connect timeout=3)')) Process finished with exit code 0
在超時引數中設定 None
以在 Python 請求中實現超時
在連線到非常慢的網站並且響應時間比通常需要的時間更長的特定情況下,超時設定為無
。
例子:
import requests
try:
req = requests.request("GET", "https://1337xto.to", timeout=None)
print(req)
except requests.ReadTimeout:
print("READ TIME OUT")
實現超時以替代 Python 請求
Python 請求的 request.get()
超時有許多替代方案,但大多數都是多餘的或不受支援的。本例中使用了第三方庫包 eventlet
來執行超時。
- 匯入 Python 庫包 -
requests
和eventlet
。 monkey_patch
將標準eventlet
庫與它的綠色等效項進行修補。- 在
try
塊內,將eventlet.Timeout
設定為所需的秒數。 - 使用
request.get()
語法初始化變數req
以儲存 URL 響應。 - 在
except
塊內,列印超時訊息。
例子:
import requests
import eventlet
eventlet.monkey_patch()
try:
with eventlet.Timeout(10):
req = requests.get(
"http://ipv4.download.thinkbroadband.com/1GB.zip", verify=False
)
print(req)
except:
print("timeout")
輸出:
"C:\Users\Win 10\curl.py"
timeout
Process finished with exit code 0
まとめ
在 request.get()
中實現超時,用三個 Python 請求的示例程式碼進行說明,並在 eventlet
中再舉一個例子來演示超時。
讀完本文後,讀者將能夠在 Python 請求中實現超時。