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个

  1. http保持长连接导致短时间内大量连接存在,最终服务器拒绝访问;
  2. 访问次数频繁,被禁止访问
    原因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次,最终如果还是不行就把错误报出来跳出程序

----更新------
最近同事反馈又报了这个错误,查了一下不是这个方法报的错,是别的访问接口的方法。目前来说这种解决方式应该还是可行的。
写了个装饰器,把所有访问接口方法的封装起来。后续再看看会不会报错。

posted @ 2022-05-30 15:58  丛影HHZ  阅读(1961)  评论(0编辑  收藏  举报