如何使用Python requests库检测代理服务器是否正常工作?
你当前操作的核心错误
- 代理协议前缀配置错误,是触发SSL报错的直接原因
你从公开免费代理列表获取的8080端口代理,绝大多数是仅支持明文HTTP转发的普通代理,本身没有在对应端口开启SSL加密监听。你在proxies字典中给"https"键配置了https://代理IP:端口的地址,会让requests优先和代理做SSL加密握手,而代理收到明文握手请求后直接返回HTTP协议响应,自然会抛出[SSL: WRONG_VERSION_NUMBER]的版本不匹配错误。
这里需要明确:requests中proxies的"https"键,含义是「当访问HTTPS地址的目标网站时,使用哪条代理通道转发流量」,和代理本身是否采用HTTPS加密没有关系。绝大多数公开免费代理,不管转发HTTP还是HTTPS目标的流量,通道地址都只需要用http://前缀即可。 - 把ping通IP等同于代理可用,属于检测逻辑误区
ping命令走ICMP网络层协议,只能证明你的主机到代理服务器IP的网络路由是通的,完全检测不到代理服务本身的运行状态——比如代理端口是否开放、是否设置了访问白名单、是否已经离线失效,这些都没法通过ping结果判断。
用requests正确检测代理可用性的操作方法
- 修正代理配置规则:所有普通免费HTTP代理,统一用
http://前缀配置代理地址,哪怕是用来转发HTTPS目标的流量 - 检测时覆盖两类测试目标:
- 普通HTTP地址,验证代理的明文转发能力
- HTTPS地址,验证代理的CONNECT隧道建立能力(也就是能不能正常转发加密的HTTPS流量)
- 检测时不要只看状态码,要完整捕获所有请求类异常,同时验证返回内容匹配预期
可直接复用的检测逻辑参考:import requests from requests.exceptions import RequestException def proxy_available(ip_port: str, timeout: int = 3) -> bool: proxy_conf = { "http": f"http://{ip_port}", "https": f"http://{ip_port}" } # 两类测试地址 test_targets = [ "http://httpbin.org/ip", "https://httpbin.org/ip" ] for target in test_targets: try: res = requests.get( target, proxies=proxy_conf, timeout=timeout ) res.raise_for_status() # 校验返回内容是接口的正常响应,而非代理的拦截页 if "origin" not in res.json(): return False except RequestException: return False return True - 额外提示:免费公开代理的失效率极高,你拿到的50个代理全部无法使用是非常普遍的情况,大部分公开代理的存活时间都不超过10分钟,且很多代理只能转发HTTP流量,没法正常建立HTTPS隧道。
内容的提问来源于stack exchange,提问作者dontoronto
相关产品推荐
相关产品推荐

