具体可能会遇到的是以下这些情况:
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProxyError('Cannot connect to proxy.', OSError(0, 'Error'))'
requests.exceptions.ProxyError: HTTPSConnectionPool(host='www.baidu.com.com', port=443): Max retries exceeded with url:
/ (Caused by ProxyError('Cannot connect to proxy.', OSError(0, 'Error')))
症状原因:
windows系统使用了全局代理
python 旧版的urllib 在生成https代理变量的时候会把本地的http代理添加为https。
运行下方代码:
import urllib.request
proxies = urllib.request.getproxies_registry()
print(proxies)
运行结果:
{'http': 'http://xxxxx', 'https': 'https://xxxxx', 'ftp': 'http://xxxxx'}
具体问题部分代码 【request.py 里面的 getproxies_registry()】:(就是这片代码当时的判断没做好,导致到其他新版模块出错,这个问题在后续的更新完善了,所以我选择了解决方案四)
if proxyServer[:5] == 'http:':
proxies['http'] = proxyServer
else:
proxies['http'] = 'http://%s' % proxyServer
proxies['https'] = 'https://%s' % proxyServer
proxies['ftp'] = 'ftp://%s' % proxyServer
解决方案有几个
一、在运行代码之前先设置好本地的代理环境:
import os
os.environ['HTTPS_PROXY'] = 'http://your-https-proxy:port'
注意是要http: 不是https:
二、修改urllib代码,让它兼容当前的其他包
proxies['https'] = 'https://%s' % proxyServer 这一行注释
或者修改为
proxies['https'] = 'http://%s' % proxyServer
三、降级使用(建议古老的代码什么的使用)
把pip requests urllib3 降级到 2020年以前的版本就能正常使用了
requests 2.20.1
urllib3 1.24.3
pip 20.2.2
四、将python升级到3.11版本(我的选择)
我出问题的是3.7.0,之前一直在用的旧包,所以都是正常的,后面硬盘坏了,虽然python3.7.0装回去了
但是在安装urllib3,跟requests的时候它默认是安装的最新版,也就出现了用着2017年还是19年的urllib配合着urllib3跟requests
具体哪个版本修复了以上问题我这边不是太清楚,升级后就正常了
更新完之后运行下方代码:
import urllib.request
proxies = urllib.request.getproxies_registry()
print(proxies)
运行结果就变成了:
{'http': 'http://xxxxx', 'https': 'http://xxxxx', 'ftp': 'http://xxxxx'}