python程序根據url從互聯網上批量下載圖片時,設置HTTP或Socket超時,來防止爬蟲爬取某個頁面時間過長,導致程序卡置不前。
一種解決方案是全局設置:
import socket
socket.setdefaulttimeout(t)
t:代表經過t秒后,如果還未下載成功,自動跳入下一次操作,此次下載失敗
另外一種解決方案是:
使用timeout 參數可以設定等待連接的秒數,如果等待超時,Requests會拋出異常
>>> requests.get('http://github.com', timeout=0.001) Traceback (most recent call last): File "<stdin>", line 1, in <module> requests.exceptions.Timeout: HTTPConnectionPool(host='github.com', port=80): Request timed out. (timeout=0.001)
>>> requests.get('https://www.baidu.com',timeout=0.5)
<Response [200]>
timeout 僅對連接過程有效,與響應體的下載無關。 timeout 並不是整個下載響應的時間限制,而是如果服務器在 timeout 秒內沒有應答,將會引發一個異常(更精確地說,是在 timeout 秒內沒有從基礎套接字上接收到任何字節的數據時)。
第三種
import
time
import
requests
from
requests.adapters
import
HTTPAdapter
s
=
requests.Session()
print
(time.strftime(
'%Y-%m-%d %H:%M:%S'
))
try
:
return
r.text
except
requests.exceptions.RequestException as e:
print
(e)
print
(time.strftime(
'%Y-%m-%d %H:%M:%S'
))
max_retries 為最大重試次數,重試3次,加上最初的一次請求,一共是4次,所以上述代碼運行耗時是20秒而不是15秒
第四種:捕獲請求異常:
def
gethtml(url):
i
=
0
while
i <
3
:
try
:
html
=
requests.get(url, timeout
=
5
).text
return
html
except
requests.exceptions.RequestException:
i
+
=
1
|