python requests库从接口get数据报错Max retries exceeded with url解决方式记录
问题:
session = HTMLSession()
r: requests_html.HTMLResponse
r = session.get(url=req["url"], params=req["params"], cookies=req["cookies"]
在跑的过程偶然出现一次Max retries exceeded with url报错,虽然只有一次,为了稳妥起见,我还是去查了一下可能的原因和解决办法
报错信息为
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] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。'))
解决方案:
经查找,可能的原因有2个
- http保持长连接导致短时间内大量连接存在,最终服务器拒绝访问;
- 访问次数频繁,被禁止访问
原因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
总的来说,就是访问时关闭TCP长连接"headers={'Connection': 'close',}",再用try……excep捕捉错误,捕捉到之后就等待2s后重连,总共尝试重连3次,最终如果还是不行就把错误报出来跳出程序
----更新------
最近同事反馈又报了这个错误,查了一下不是这个方法报的错,是别的访问接口的方法。目前来说这种解决方式应该还是可行的。
写了个装饰器,把所有访问接口方法的封装起来。后续再看看会不会报错。