代理可用性核心是能否在超时内完成真实HTTP请求并返回200且响应体有效;需设connect=5/read=10超时、校验响应内容、轮换检测地址、随机延时、控制并发、规范解析代理格式。

用 requests 发起带超时的 HTTP 请求验证代理连通性
代理可用性的核心判断依据是:能否在合理时间内完成一次真实 HTTP 请求(比如 GET http://httpbin.org/ip),并返回 200 状态码。关键不是“连上代理”,而是“代理能帮你成功发出请求并拿到响应”。
必须设置 timeout,否则一个挂死的代理会让整个脚本卡住。建议分两段设:连接超时 connect=5,读取超时 read=10,避免因目标网站响应慢误判代理失效。
requests.get(url, proxies={'http': 'http://user:pass@host:port', 'https': 'http://user:pass@host:port'}, timeout=(5, 10))- 若代理需认证但没提供用户密码,
proxies值应为{'http': 'http://host:port', 'https': 'http://host:port'},否则会触发InvalidURL - HTTPS 代理必须支持 CONNECT 隧道;若只填
http://协议却用来发 HTTPS 请求,大概率返回400 Bad Request或直接断连
批量检测时如何避免被目标站封 IP 或限速
高频请求同一目标(如反复调 httpbin.org/ip)容易触发风控,尤其用大量代理轮询时。这不是代理问题,是你的检测行为本身成了异常流量。
- 每次请求后加随机延时:
time.sleep(random.uniform(0.5, 2.0)),别用固定值 - 换多个轻量检测地址轮询,比如:
['http://httpbin.org/ip', 'https://api.ipify.org', 'http://ifconfig.me/ip'],分散请求指纹 - 禁用默认 User-Agent,为每个请求设不同标识:
headers={'User-Agent': random.choice(ua_list)},ua_list可从fake-useragent库生成 - 绝对不要并发开几百个线程——用
concurrent.futures.ThreadPoolExecutor(max_workers=10)控制并发数,既提速又不激进
解析代理格式时常见的字符串陷阱
代理列表常以文本形式存在(如 ip:port、user:pass@ip:port、socks5://user:pass@ip:port),手动切分极易出错。
立即学习“Python免费学习笔记(深入)”;
- 用
urllib.parse.urlparse()解析完整 URL 格式最稳,它能自动区分协议、认证信息和地址,比.split('@')可靠得多 - 纯
ip:port字符串要补协议前缀才能进proxies字典,否则requests报MissingSchema - 端口号非数字、IP 地址含空格或不可见字符(如复制粘贴带 \u200b)会导致
ConnectionRefusedError或InvalidSchema,建议用正则预清洗:re.sub(r'\s+', '', line.strip())
结果判定不能只看 status_code == 200
有些代理会返回 200,但响应体是 HTML 登录页、运营商广告页或空内容,实际并未转发请求。必须校验响应是否真正来自目标站点。
- 对
httpbin.org/ip,检查response.json().get('origin')是否包含你期望的代理 IP(注意可能有多个 IP 用逗号分隔) - 对
api.ipify.org,直接比对response.text.strip()和代理 IP 字符串 - 若响应中出现
'authenticationrequired'、'login'、'unauthorized'等关键词,即使 status_code 是 200 也要标为失效 - 捕获
requests.exceptions.ProxyError、ConnectTimeout、ReadTimeout、ConnectionError这四类异常,它们比 HTTP 状态码更能反映代理底层连通性
代理检测真正的难点不在发请求,而在区分“假成功”——表面通了,实际没走通。多一层响应体校验,漏判率能降一半。


















