Python 3.x中requests使用代理访问HTTPS报错的问题咨询
关于“代理不支持HTTPS”的说法判断
该说法属于可能的诱因之一,但不是唯一的故障原因,当前报错的核心原因是requests无法和你配置的代理地址建立有效连接,需要按优先级排查问题。
故障排查与解决步骤
第一步:先修正代理配置的格式错误
你当前的proxies配置多套了一层列表,requests要求的proxies参数是字典类型,不是包含字典的列表,这是最容易忽略的低级错误:
错误写法:proxies = [{ 'http' : 'http://ip:port', 'https' : 'http://ip:port' }]正确写法:
proxies = { 'http' : 'http://ip:port', 'https' : 'http://ip:port' # 绝大多数代理的HTTPS请求也走HTTP代理端口,不需要写成HTTPS开头的代理地址 }调整配置后先重新测试,大部分该类报错都是格式问题导致的。
第二步:验证代理本身的连通性
不要在代码中测试,直接用本地工具验证代理可用性,比如curl命令:curl -x http://你的代理ip:端口 https://www.baidu.com -v
如果是HTTPS类型的代理,测试命令为:curl -x https://你的代理ip:端口 https://www.baidu.com -v
如果上述命令返回失败,说明代理本身不可用,和代码配置无关,需要更换可用代理。第三步:排除环境变量干扰
requests会默认读取系统的HTTP_PROXY、HTTPS_PROXY环境变量,如果系统配置了无效的代理环境变量,会覆盖你代码中的配置,可以在请求前添加代码强制关闭环境变量读取:import os os.environ['NO_PROXY'] = '*'第四步:适配带认证的代理
如果你的代理需要账号密码认证,未配置认证信息也会触发连接失败,配置写法如下:proxies = { 'http' : 'http://账号:密码@ip:port', 'https' : 'http://账号:密码@ip:port' }搭配
verify=False使用时,可以添加requests.packages.urllib3.disable_warnings()关闭冗余的证书告警。第五步:代理确实不支持HTTPS的处理方案
如果你完成上述测试后,确认代理仅支持HTTP协议转发,可以将目标请求地址更换为HTTP协议的接口,或者直接更换支持HTTPS转发的代理服务。
内容的提问来源于stack exchange,提问作者haechang

