1. 程式人生 > >知識點講解三:關於requests裡的timeout()

知識點講解三:關於requests裡的timeout()

超時(timeout)

為防止伺服器不能及時響應,大部分發至外部伺服器的請求都應該帶著 timeout 引數。在預設情況下,除非顯式指定了 timeout 值,requests 是不會自動進行超時處理的。如果沒有 timeout,你的程式碼可能會掛起若干分鐘甚至更長時間。

連線超時指的是在你的客戶端實現到遠端機器埠的連線時(對應的是 connect() ),Request 會等待的秒數。一個很好的實踐方法是把連線超時設為比 3 的倍數略大的一個數值,因為 TCP 資料包重傳視窗 (TCP packet retransmission window) 的預設大小是 3。

在爬蟲代理這一塊我們經常會遇到請求超時的問題,程式碼就卡在哪裡,不報錯也沒有requests請求的響應。

通常的處理是在requests.get()語句中加入timeout限制請求時間

req = requests.get(url, headers=headers, proxies=proxies, timeout=5)

如果發現設定timeout=5後長時間不響應問題依然存在,可以將timeout裡的引數細化
作出如下修改後,問題就消失了

req = requests.get(url, headers=headers, proxies=proxies, timeout=(3,7))

如果在使用timeout過程中遇到ValueError錯誤提示(類似:ValueError: Timeout value connect was Timeout(connect=2.0, read=2.0, total=None), but it must be an int or float.

),這是python-requests version 2.4.3-4版本的一個bug需要我們更新一下requests

pip install -U requests

對於timeout=(3,7)中引數的具體含義我也不是很清楚,知道含義的童鞋可以留言哈