Requests报错:Max retries exceeded with url Failed to establish a new connection

项目场景:

最近在用Python多线程爬取数据,结果在运行一段时间后总是报错:

HTTPSConnectionPool: Max retries exceeded with url: 
XXX (Caused by NewConnectionError(\'<urllib3.connection.HTTPSConnection object at 0x0000022FD1FC0C40>:
Failed to establish a new connection: [Errno 10060] WSAETIMEDOUT\'))'

由于自己也出现了这些错,借鉴网上各位大佬的经验和自己的见解,总结了以下会出现的情况

问题描述

遇到的问题:

在使用多线程去请求接口时会出现这个问题,请求接口的速率过快,导致请求链接没有释放。


原因分析:

问题分析:

经过查阅资料,发现这个错误产生的原因是 SSL 证书报错,http连接太多没有关闭导致http的连接数超过最大限制。由于http默认情况下连接是Keep-alive的,所以这就导致了服务器保持了太多连接而不能再新建连接,不然就会产生这样的错误提示。

具体扣一分以下三种情况:

ip被封

程序请求速度过快。

使用了代理


解决方案:

看了很多的博主的报错解决,总结了这些解决方案,来解决我这个问题:

第一步:增加睡眠时间,减少访问频率

time.sleep()

第二步:关闭 SSL 验证,设置verify=False

requests.post(url, data=data, headers=headers, verify=False)

第三步:释放请求链接,使用close()

res = requests.post(url, data=data, headers=headers, verify=False)
json = res.json()
res.close()

第四步:降低requests和urllib3版本

最新的urllib3有更严格ssl的校验,所以,用以下方案解决
pip uninstall requests urllib3  # 先卸载
 
pip install requests==2.27  urllib3==1.25.8  # 指定版本安装,不然默认会装最新版

这几个步骤就解决了我现在的报错问题,可能还会有其他的解决方式,记录一下解决的方法步骤。

参考内容
解决:requests.exceptions.ProxyError:HTTPSConnectionPool(host=‘xxx.com’,port=443):Max retries exceeded

你可能感兴趣的:(python,django,pip)