You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python requests检测代理存活与ProxyChecker结果不一致原因

Python requests代理存活检测结果偏差问题分析

初始检测实现代码

import requests

proxies = []

for i in proxies:
    prox = {"prox": f"http://{i}"}
    r = requests.get("http://google.es", proxies=prox, timeout=5)

    latency = r.elapsed 
    latency = int(latency.total_seconds() * 1000)
    print(r.status_code) 

异常现象

  • 上述代码测试10个代理时,全部返回200状态码,延迟均低于100ms
  • 同批次代理使用基于pycurl开发的ProxyChecker库测试时,仅3个代理判定为可用
  • 测试提示:请勿使用0.6版本的ProxyChecker,该版本已过时,半数场景下无法正常工作,建议使用后续维护版本。

结果差异核心原因&原有代码问题

1. 代理配置存在致命错误,请求根本未走代理

requests库的proxies参数有严格的格式要求:字典键必须匹配请求目标的URI协议,合法键值为http、https等,只有匹配到对应协议的键时,requests才会使用对应的代理发起请求。
原有代码中代理字典的键写为prox,属于完全无效的配置项,会被requests直接忽略,所有请求实际走的是本地默认网络,和待测试的代理没有任何关系。这时候返回的200状态码、低延迟数据,要么是本地网络直连目标站点的结果,要么是本地网络运营商劫持返回的伪造200响应,自然会出现所有代理全可用的错误结果。

2. 存活判断逻辑过于简陋,误判率极高

就算修正代理配置的键名错误,原有逻辑仅靠HTTP状态码200判断代理可用也完全不可靠:

  • 大量失效代理、透明代理、引流代理会对任意请求返回200状态码,实际响应内容是广告页、拦截提示页、代理自身的报错页,根本不是目标站点的真实内容
  • 部分半残代理可以快速返回响应头(满足r.elapsed的低延迟统计条件),但后续响应体传输卡顿、内容截断甚至直接中断,实际完全无法正常使用

3. 超时与延迟统计逻辑存在缺陷

  • 原有代码传入的timeout=5为单值配置,仅对连接和读取阶段设置统一超时阈值,没有覆盖DNS解析、代理握手等环节的超时控制,容易出现长时间卡住的问题
  • r.elapsed统计的是从请求发起至收到响应头的耗时,不是完整响应接收完成的端到端耗时,统计出的延迟数据参考价值极低

4. 没有做协议适配校验

不同代理支持的协议不同,部分代理仅支持HTTPS隧道、SOCKS协议,不支持明文HTTP转发,原有代码统一给代理地址加http://前缀的写法,遇到不兼容的代理时可能收到代理本地返回的200响应,造成可用假象。而基于pycurl实现的检测工具会严格校验代理端到端隧道连通性、响应内容合法性、完整传输过程有效性,判定标准要严格得多。

修正后的基础检测逻辑参考

import requests

# 测试目标地址
TEST_URL = "http://google.es"
# 目标站点特征字符串,用于校验响应真实性
CONTENT_MARKER = "<title>Google</title>"
test_proxies = []

for proxy in test_proxies:
    proxy_config = {
        "http": f"http://{proxy}",
        "https": f"http://{proxy}"
    }
    try:
        resp = requests.get(
            TEST_URL,
            proxies=proxy_config,
            timeout=(5, 5),  # 分别设置连接超时5s、读取超时5s
            allow_redirects=True
        )
        # 同时校验状态码和响应内容
        if resp.status_code == 200 and CONTENT_MARKER in resp.text:
            latency = int(resp.elapsed.total_seconds() * 1000)
            print(f"代理{proxy}可用,延迟{latency}ms")
        else:
            print(f"代理{proxy}无效,状态码:{resp.status_code}")
    except Exception as e:
        print(f"代理{proxy}连接失败:{str(e)}")

内容的提问来源于stack exchange,提问作者Learning from masters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:01:05