Python Requests使用代理后IP未变更问题排查求助
代理轮换后仍暴露真实IP:问题排查与解决方案
一、代码的核心错误
你请求的是HTTPS协议的IP追踪接口,但仅配置了HTTP类型的代理——requests库不会自动将HTTP代理复用给HTTPS请求,这直接导致所有HTTPS请求都绕过了代理,使用你的真实IP发起连接。另外代码遗漏了time模块的导入,运行时会触发报错。
修正后的完整代码:
import requests import time # 补上缺失的模块导入 headers = { "User-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" } # 同时配置HTTP和HTTPS代理项 proxi = {"http": "", "https": ""} prox_ping_ready = ["173.219.112.85:8080", "43.132.148.107:2080", "216.176.187.99:8886", "193.108.21.234:1234", "151.80.120.192:3128", "139.255.10.234:8080", "120.24.33.141:8000", "12.88.29.66:9080", "47.241.66.249:1081", "51.79.205.165:8080", "63.250.53.181:3128", "160.3.168.70:8080"] ipTracker = ["wtfismyip.com/text", "api.ip.sb/ip", "ipecho.net/plain", "ifconfig.co/ip"] for element in prox_ping_ready: proxy_addr = f"http://{element}" proxi["http"] = proxy_addr proxi["https"] = proxy_addr # 为HTTPS请求配置对应代理 for choice in ipTracker: try: # 去除返回结果中的换行符,优化输出格式 current_ip = requests.get(f'https://{choice}', proxies=proxi, timeout=1, headers=headers).text.strip() print(f'代理[{element}] | 检测站点[{choice}] | 出口IP: {current_ip}') except Exception as e: print(f'代理[{element}] 访问{choice}失败: {str(e)}') time.sleep(3)
二、免费代理的真实现状
你遇到的情况确实存在:多数免费代理标注的“elite/anonymous”匿名性形同虚设:
- 大量免费代理实际是透明代理,会在请求头中透传你的真实IP(比如
X-Forwarded-For字段); - 免费代理稳定性极差,多数代理在你获取时已经失效,或者使用几次后就被目标站点封禁;
- 部分代理服务商为了凑数,会将无效或低质量的代理错误标记为高匿名,实际无法隐藏真实IP。
三、检测代理匿名性的方法
你可以通过以下步骤检测代理的匿名等级:
- 对比出口IP:先获取自己的真实IP,再通过代理请求IP检测站点,若返回的IP与真实IP不一致,说明代理至少能隐藏出口IP;
- 检查请求头透传:使用能返回完整请求头的接口,查看是否存在
X-Forwarded-For、X-Real-IP、Via这类字段:- 若不存在这些字段,且出口IP为代理IP → 高匿名代理(elite);
- 若存在这些字段,但字段值不包含你的真实IP → 匿名代理(anonymous);
- 若字段值包含你的真实IP → 透明代理,无法隐藏真实IP;
- 封装检测逻辑的示例代码:
def check_proxy_anonymity(proxy): # 先获取本地真实IP real_ip = requests.get("https://wtfismyip.com/text", headers=headers).text.strip() # 配置代理 proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"} try: # 请求返回完整请求信息的接口(可自行搭建或使用合规的检测接口) resp = requests.get("https://xxx/get", proxies=proxies, headers=headers, timeout=3) resp_data = resp.json() proxy_out_ip = resp_data.get("origin", "").split(",")[0].strip() request_headers = resp_data.get("headers", {}) if proxy_out_ip != real_ip: if "X-Forwarded-For" not in request_headers: return f"代理[{proxy}] | 高匿名(elite)" elif real_ip not in request_headers.get("X-Forwarded-For", ""): return f"代理[{proxy}] | 匿名(anonymous)" else: return f"代理[{proxy}] | 透明(transparent,透传真实IP)" else: return f"代理[{proxy}] | 无效(直接使用真实IP)" except Exception as e: return f"代理[{proxy}] | 失效: {str(e)}"
内容的提问来源于stack exchange,提问作者python_ftw
相关产品推荐
相关产品推荐

