python程序根據url從互聯網上批量下載圖片時,設置HTTP或Socket超時,來防止爬蟲爬取某個頁面時間過長,導致程序卡置不前。我之前開發的一個腳本讀取kafka 就是拿圖片 后續一直卡在這里。
一種解決方案是全局設置:
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()
s.mount('http://', HTTPAdapter(max_retries=3))
s.mount('https://', HTTPAdapter(max_retries=3))
print(time.strftime('%Y-%m-%d %H:%M:%S'))
try:
r = s.get('http://www.google.com.hk', timeout=5)
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
