Python requests配置HTTPS代理发起请求报错问题咨询
问题排查结论
核心原因基本是两个:一是你一开始的代理配置格式有问题,二是你用的免费HTTPS代理绝大多数本身就不可用。
配置格式的正确写法
requests的proxies字典规则很多人搞混:key对应的是你要访问的目标站点的协议,不是代理本身的协议:
- 要访问HTTP站点,代理配置写在
http键下 - 要访问HTTPS站点,代理配置写在
https键下
而键对应的value,必须写全代理本身的协议前缀,不能只写IP:端口。你第一次写"https" : "207.236.12.76:10458"就是缺了前缀,requests默认会按普通明文HTTP方式去连代理,发HTTPS请求时TLS握手直接失败,就抛你看到的SSLEOFError。
为什么加了前缀还是报错
你加了https://前缀之后报Tunnel connection failed: 403 Forbidden,说明你已经能连上这个代理的端口了,但代理直接拒绝了你的HTTPS转发请求,这就是免费代理的通病:
- 免费代理存活时间极短,很多你爬取下来的时候就已经失效,要么端口关闭要么服务重启
- 很多代理列表里标了HTTPS的代理,实际根本不支持CONNECT隧道方法,根本转发不了HTTPS流量,只能传HTTP请求,收到HTTPS转发请求直接返回403
- 部分免费代理有IP白名单限制,只允许特定地区/特定IP段的用户使用,陌生IP访问直接拦截
- 还有不少免费代理是蜜罐,根本不提供正常的代理转发服务,连上去只会返回错误
另外提个容易踩的坑:绝大多数能转发HTTPS流量的普通代理,本身和客户端之间是明文HTTP通信的,只是支持CONNECT隧道建立到目标站点的HTTPS连接,这种代理在配置时,https键对应的值应该加http://前缀,不是说访问HTTPS站点就必须给代理地址加https://前缀——只有代理本身和客户端通信也走TLS加密的时候,才需要加https://前缀,这类代理在免费池里几乎找不到。
快速验证方法
你可以拿确认可用的代理(比如自己搭建的、或者付费的高匿代理)用下面的代码测试,配置正确的话不会出现这两个报错:
import requests from requests.exceptions import RequestException # 测试时代理地址记得补全前缀 proxies = [ {"https": "http://代理IP:端口"}, {"https": "https://代理IP:端口"} ] url = "https://api.ipify.org?format=json" for proxy in proxies: try: resp = requests.get(url, proxies=proxy, timeout=10) print(f"代理可用,返回IP:{resp.text}") except RequestException as e: print(f"代理不可用,错误信息:{str(e)}")
内容的提问来源于stack exchange,提问作者jiw
相关产品推荐
相关产品推荐

