由於數據量的增大,調用接口的次數會增加。
當連續向目標網站發送多次request后,目標網站可能會認為是,惡意攻擊。
於是會拋出requests異常。
測試代碼:
for i in range(200): # 連續請求200次
requests.post(p['url'], headers=p['headers'], json=p['body'], verify=False)
在python3.6中,異常為
requests.exceptions.SSLError: HTTPSConnectionPool(host='', port=443): Max retries exceeded with url:
(Caused by SSLError(SSLError("bad handshake: SysCallError(-1, 'Unexpected EOF')",),))
在python3.7中,異常為
requests.exceptions.ConnectionError: ('Connection aborted.', ConnectionResetError(10054, '遠程主機強迫關閉了一個現有的連接。', None, 10054, None))
嘗試百度了不少方法,如time.sleep(1),response.close(),socket.setdefaulttimeout(20)。
要么無效果,要么經不起多次驗證。
既然是異常,那么就try唄。
把異常捕獲,重新請求一次。
在等待異常過程中,變相的time.sleep了。
按照這個思路,寫代碼,驗證,目前來看還是相對靠譜的。
while True: # 循環
try:
r = eval(expression)
except (requests.exceptions.SSLError, requests.exceptions.ConnectionError) as e:
if 'bad handshake' in str(e) or '10054' in str(e): # 上述2種異常
continue # 繼續發請求
else:
raise Exception(e) # 其他異常,拋出來
break # 無異常就跳出循環
return r # 返回響應結果
版權申明:本文為博主原創文章,轉載請保留原文鏈接及作者。