判断代理匿名度需向httpbin.org/headers发起请求,检查x-forwarded-for、x-real-ip、via头:存在本机ip为透明代理,存在其他ip且含via为普通匿名,三者均缺失且无本机ip为高匿代理;同时应设timeout、禁用连接池、控制并发并人工抽检。

用 requests 发起带标识的探测请求,判断匿名度类型
代理是否“匿名”,本质是看目标服务器看到的请求头中是否暴露了真实客户端信息。关键看 X-Forwarded-For、X-Real-IP 和 Via 这三个头是否被代理透传或伪造。
实操建议:向一个能返回原始请求头的公开接口(如 http://httpbin.org/headers)发起请求,检查响应体中的 headers 字段:
- 如果
X-Forwarded-For存在且值为你的本机 IP 或多个 IP(含你的真实 IP),属于「透明代理」 - 如果
X-Forwarded-For存在但值是其他 IP(非你本机),且Via存在 → 「普通匿名代理」 - 如果这三个头都缺失,且响应中没出现你本机 IP → 「高匿代理」
注意:有些代理会主动删除 X-Forwarded-For 但保留 Proxy-Connection 等特征头,也应视为不完全匿名。
控制超时与重试,准确测量真实延迟
单纯用 time.time() 包裹 requests.get() 得到的不是网络延迟,而是 DNS 解析 + TCP 握手 + TLS 协商 + 请求发送 + 响应接收的总耗时。对批量检测来说,必须限制上限,否则单个卡死代理会拖垮整个任务。
实操建议:
- 设置
timeout=(3, 7):3 秒连通,7 秒内必须收到响应体 - 禁用连接池复用:
session = requests.Session(); session.headers.update({'Connection': 'close'}),避免旧连接状态干扰 - 不依赖
requests.adapters.DEFAULT_RETRIES,手动捕获requests.exceptions.Timeout和requests.exceptions.ConnectionError后跳过
延迟值取 response.elapsed.total_seconds(),它只统计从发完请求到收完响应的时间,更贴近实际可用延迟。
并发控制不当会导致大量 ConnectionRefusedError 或被封
对同一目标站点(如 httpbin.org)高频并发请求,容易触发服务端限流;而对代理本身并发过高,则可能被代理服务主动断连,表现为大量 [Errno 111] Connection refused 或空响应。
实操建议:
- 用
concurrent.futures.ThreadPoolExecutor(max_workers=10)控制并发数,10 是较安全的起点;若代理质量差,降到 5 更稳 - 每个代理单独建
requests.Session(),避免 headers / cookies / adapter 配置互相污染 - 加随机 jitter:在每次请求前
time.sleep(random.uniform(0.1, 0.5)),降低指纹识别风险
别用 asyncio + aiohttp 直接怼——多数免费代理不支持 HTTP/2 或长连接,反而更容易失败。
结果分类后仍需人工抽检高匿代理
自动判断只能覆盖常见模式。比如某些代理会把 X-Forwarded-For 改成 127.0.0.1 或 unknown,看起来像高匿,但实际仍可被服务端通过其他方式(如 TLS JA3 指纹、TCP 时间戳)识别为代理流量。
真正关键的点是:检测脚本跑出来的「高匿」列表,一定要挑出 3–5 个,用浏览器开发者工具的 Network 面板手动发请求,对比请求头和响应头——机器没法替代人眼确认「对方到底看见了什么」。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











