python中關(guān)于requests里的timeout()用法
關(guān)于requests里的timeout()用法
timeout(超時(shí))
首先是:為防止服務(wù)器不能及時(shí)響應(yīng),大部分發(fā)至外部服務(wù)器的請(qǐng)求都應(yīng)該帶著 timeout 參數(shù)。在默認(rèn)情況下,除非顯式指定了 timeout 值,requests 是不會(huì)自動(dòng)進(jìn)行超時(shí)處理的。如果沒有 timeout,你的代碼可能會(huì)掛起若干分鐘甚至更長(zhǎng)時(shí)間
其次是:連接超時(shí)指的是在你的客戶端實(shí)現(xiàn)到遠(yuǎn)端機(jī)器端口的連接時(shí)(對(duì)應(yīng)的是 connect() ),Request 會(huì)等待的秒數(shù)。一個(gè)很好的實(shí)踐方法是把連接超時(shí)設(shè)為比 3 的倍數(shù)略大的一個(gè)數(shù)值,因?yàn)?TCP 數(shù)據(jù)包重傳窗口 (TCP packet retransmission window) 的默認(rèn)大小是 3。
在爬蟲代理這一塊我們經(jīng)常會(huì)遇到請(qǐng)求超時(shí)的問題,代碼就卡在哪里,不報(bào)錯(cuò)也沒有requests請(qǐng)求的響應(yīng)。
通常的處理是在requests.get()語句中加入timeout限制請(qǐng)求時(shí)間
req = requests.get(url, headers=headers, proxies=proxies, timeout=5)
如果發(fā)現(xiàn)設(shè)置timeout=5后長(zhǎng)時(shí)間不響應(yīng)問題依然存在,可以將timeout里的參數(shù)細(xì)化
作出如下修改后,問題就消失了
req = requests.get(url, headers=headers, proxies=proxies, timeout=(3,7))
python requests timeout 分析
最近在搞爬蟲,很多小組件里面都使用了 Python 的 requests
庫(kù),很好用,很強(qiáng)大。
但最近發(fā)現(xiàn)很多任務(wù)總是莫名其妙的卡住,不報(bào)錯(cuò),但是就是不繼續(xù)執(zhí)行。
排查了一圈,最后把問題鎖定在 requests
的 timeout
機(jī)制上。
注:
本文討論的是 Python 的第三方模塊 requests ,并不是 Python 內(nèi)建模塊 urllib 中的 request 模塊,請(qǐng)注意區(qū)分。
如何設(shè)置超時(shí)時(shí)間
requests
設(shè)置超時(shí)時(shí)間有兩種方式。
一種是設(shè)置單一值作為 timeout,如下所示:
r = requests.get('https://github.com', timeout=5)
這時(shí), timeout
值將會(huì)用作 connect
和 read
二者的共同的超時(shí)時(shí)間。
另一種是分別制定連接超時(shí)和讀取超時(shí)的時(shí)間,如下所示:
r = requests.get('https://github.com', timeout=(3.05, 27))
這里前面的 3.05
表示連接超時(shí)時(shí)間, 27
表示讀取超時(shí)時(shí)間。
官方一般推薦大家把連接超時(shí)時(shí)間設(shè)置為比 3 的整數(shù)倍稍微大一點(diǎn)的時(shí)間,比如 3.05
、 6.05
這樣。
坑
上面提到的兩種超時(shí)時(shí)間,連接超時(shí)和讀取超時(shí),并不是都有默認(rèn)超時(shí)時(shí)間。
連接超時(shí)的默認(rèn)時(shí)間是 21s
,而讀取超時(shí)沒有默認(rèn)時(shí)間,換句話說,不會(huì)超時(shí)。
也就是說,如果一個(gè)請(qǐng)求,連接成功了,正在讀取數(shù)據(jù),但是此時(shí)服務(wù)器出現(xiàn)了什么問題,或者代理出現(xiàn)了什么問題,那么,這個(gè)請(qǐng)求就會(huì)一直卡住,不會(huì)報(bào)錯(cuò),也不會(huì)繼續(xù)。
天長(zhǎng)地久。
避坑
所以,為了避免出現(xiàn)這樣的情況,給你的 requests
加上超時(shí)時(shí)間吧,尤其是請(qǐng)求量巨大的時(shí)候。
常在河邊走,哪有不濕鞋。
參考資料 Requests 官方文檔
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python編程matplotlib繪圖挑鉆石seaborn小提琴和箱線圖
這篇文章主要為大家介紹了Python編程如何使用matplotlib繪圖來挑出完美的鉆石以及seaborn小提琴和箱線圖,有需要的朋友可以借鑒參考下,希望能夠優(yōu)速幫助2021-10-10利用Python內(nèi)置庫(kù)實(shí)現(xiàn)創(chuàng)建命令行應(yīng)用程序
Python?有一個(gè)叫做argparse的內(nèi)置庫(kù),可以用它來創(chuàng)建一個(gè)命令行界面。本文將詳解如何利用argparse實(shí)現(xiàn)創(chuàng)建一個(gè)命令行應(yīng)用程序,需要的可以參考一下2022-06-06python實(shí)現(xiàn)sqlalchemy的使用概述
SQLAlchemy是Python中最有名的ORM工具,特點(diǎn)是操縱Python對(duì)象而不是SQL查詢,也就是在代碼層面考慮的是對(duì)象,而不是SQL,體現(xiàn)的是一種程序化思維,這樣使得Python程序更加簡(jiǎn)潔易懂,具體內(nèi)容詳情跟隨小編一起看看吧2021-08-08Python基于PycURL自動(dòng)處理cookie的方法
這篇文章主要介紹了Python基于PycURL自動(dòng)處理cookie的方法,實(shí)例分析了Python基于curl操作cookie的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07python中的隨機(jī)數(shù)種子seed()用法說明
這篇文章主要介紹了python中的隨機(jī)數(shù)種子seed()用法說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07