python requests庫從接口get數(shù)據(jù)報(bào)錯Max retries exceeded with url解決方式記錄
問題:
session = HTMLSession()
r: requests_html.HTMLResponse
r = session.get(url=req["url"], params=req["params"], cookies=req["cookies"]
在跑的過程偶然出現(xiàn)一次Max retries exceeded with url報(bào)錯,雖然只有一次,為了穩(wěn)妥起見,我還是去查了一下可能的原因和解決辦法
報(bào)錯信息為
requests.exceptions.ConnectionError: HTTPConnectionPool(host='..com', port=80): Max retries exceeded with url: /diagno/version/data?=23&=23&=10&=10&=111&=273 (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x09C44280>: Failed to establish a new connection: [WinError 10060] 由于連接方在一段時間后沒有正確答復(fù)或連接的主機(jī)沒有反應(yīng),連接嘗試失敗。'))
解決方案:
經(jīng)查找,可能的原因有2個
- http保持長連接導(dǎo)致短時間內(nèi)大量連接存在,最終服務(wù)器拒絕訪問;
- 訪問次數(shù)頻繁,被禁止訪問
原因2需要加代理,我就先不加,接下來只對原因1處理
from requests_html import HTMLSession
def api_get_html(self, req: dict):
session = HTMLSession()
for i in range(3):
try:
r: requests_html.HTMLResponse
r = session.get(url=req["url"], params=req["params"], cookies=req["cookies"],headers={'Connection': 'close',})
break
except ConnectionError as e:
logging.warning(f"{e}==>req:{str(req)}")
time.sleep(2)
else:
raise e
總的來說,就是訪問時關(guān)閉TCP長連接"headers={'Connection': 'close',}",再用try……excep捕捉錯誤,捕捉到之后就等待2s后重連,總共嘗試重連3次,最終如果還是不行就把錯誤報(bào)出來跳出程序
----更新------
最近同事反饋又報(bào)了這個錯誤,查了一下不是這個方法報(bào)的錯,是別的訪問接口的方法。目前來說這種解決方式應(yīng)該還是可行的。
寫了個裝飾器,把所有訪問接口方法的封裝起來。后續(xù)再看看會不會報(bào)錯。

浙公網(wǎng)安備 33010602011771號