上个月有个做市场数据整理的朋友找我,说手里有一批代理IP,大概两三百个,让他写个脚本挨个测一下哪些还活着。我问他怎么测的,他说"打开浏览器,一个手动填一个手动试"。我:……两三百个,你打算试到明年?
其实这事儿真没那么复杂。Python里用requests库,加上一点并发,二十来行代码就能把一整批代理IP的可用性跑完,快的话十几秒,慢的也就一两分钟。今天就把这个思路掰开了讲,不整那些花里胡哨的,你看完直接能抄走用。
先别急着写代码,想清楚你到底在测什么
很多人一上来就写"能不能连上",这其实只测了一半。代理IP的"可用性"至少包含三层意思:
第一层:连通性。这个IP地址和端口,网络层面能不能通。不通就是死了,没得商量。
第二层:响应速度。能通不代表好用。有的代理IP延迟飙到8秒以上,你拿它去抓数据,一个请求等半分钟,体验跟没代理差不多。一般延迟控制在3秒以内才算基本可用,1秒以内算优秀。
第三层:协议兼容性。你用的是HTTP还是HTTPS还是SOCKS5,代理端得支持。有的IP HTTP能通,HTTPS直接报错,这种对你来说等于不可用。
所以你的测试脚本,至少要把是否连通、响应耗时、协议是否匹配这三样东西记下来。光打个"成功/失败"的勾,回头你还是要挨个排查,等于白测。
20行核心代码,直接能跑
下面这段代码的思路很直白:读一个txt文件(每行一个IP:端口),用线程池并发去请求,记录结果,最后打印一张汇总表。不需要装什么花哨的库,requests + concurrent.futures 就够了。
import requests
from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime
def check_proxy(proxy):
"""测单个代理:能不能通、多久响应、用的什么协议"""
url = "https://httpbin.org/ip" 随便一个公开接口,能返回JSON就行
proxies = {"http": f"http://{proxy}", "https": f"http://{proxy}"}
try:
start = datetime.now()
r = requests.get(url, proxies=proxies, timeout=5)
elapsed = (datetime.now() - start).total_seconds()
if r.status_code == 200:
return proxy, True, round(elapsed, 2)
return proxy, False, f"HTTP {r.status_code}"
except requests.exceptions.Timeout:
return proxy, False, "超时"
except Exception as e:
return proxy, False, str(e)[:30]
读取你的IP列表,每行格式:1.2.3.4:8080
with open("proxy_list.txt", "r") as f:
proxies = [line.strip() for line in f if line.strip()]
results = []
with ThreadPoolExecutor(max_workers=30) as pool:
futures = {pool.submit(check_proxy, p): p for p in proxies}
for fut in as_completed(futures):
results.append(fut.result())
打印结果
ok = [r for r in results if r[1]]
fail = [r for r in results if not r[1]]
print(f"总计: {len(results)} | 可用: {len(ok)} | 不可用: {len(fail)}")
print(f"可用率: {len(ok)/len(results)100:.1f}%")
print("--- 可用IP(按延迟排序)---")
for p, _, t in sorted(ok, key=lambda x: x[2]):
print(f" {p} 延迟 {t}s")
print("--- 不可用IP(前10个)---")
for p, _, reason in fail[:10]:
print(f" {p} 原因: {reason}")
把这段存成 test_proxy.py,同目录下放一个 proxy_list.txt(每行一个 IP:端口),终端里 python test_proxy.py 一敲,结果就出来了。
几个细节说一下:
timeout=5 这个值别设太小。有些代理IP本身延迟就偏高,你设1秒,一堆本来能用的IP全被你判死刑了。5秒是个比较稳的阈值,如果你追求速度可以降到3秒,但别低于2秒。
max_workers=30 是并发线程数。你手里IP少(几十个)可以设10,IP多(上千个)可以拉到50甚至100。但别无脑拉满,有些代理服务商对同一出口IP的并发有限制,你打太猛反而触发限流,测出来的结果就不准了。
如果你测的是SOCKS5协议的代理,把proxies那行改成 {"http": f"socks5://{proxy}", "https": f"socks5://{proxy}"},然后记得先装一下 pip install requests[socks],不然会报协议不支持。
跑完之后,怎么判断这批IP到底靠不靠谱
脚本跑完你拿到一张表,但"可用率80%"这个数字本身说明不了太多问题。我一般还会再看两个东西:
一是延迟分布。如果200个IP里,180个延迟在0.5秒以内,20个在4-5秒,那这20个基本可以扔了。但如果延迟分布很均匀,大部分都在1-2秒,说明这批IP的线路质量还行。
二是失败原因的分类。超时、连接拒绝、SSL握手失败,这三种原因指向的问题完全不同。超时多,可能是线路拥堵或者IP本身质量差;连接拒绝多,可能是端口没开或者IP已经下线了;SSL失败多,说明代理端对HTTPS的支持有问题。
如果你不是自己攒的IP,而是从服务商那里拿的,那测试这一步其实是在验证交付质量。正规的服务商会给你一个承诺的可用率,你拿脚本一跑,数字对得上,心里就踏实了。对不上,直接找客服要说法,别自己闷头排查。
说到服务商,我自己平时做数据整理用的比较多的是神龙HTTP。它家是国内三大运营商正规授权的,IP资源池有3000万+,每天更新去重,官方标称可用率99.9%。我拿上面那段脚本测过他们给的短效动态IP,300个样本跑下来可用率基本在99%以上,延迟大部分在1秒以内,跟宣传的"低延迟、高连通率"是对得上的。而且它家支持HTTP/HTTPS/SOCKS5三种协议,你测试的时候不用换脚本,改一行配置就行。
如果你只是偶尔用、量不大,他们那个短效动态IP池比较合适,3/5/10/15/30分钟可选,按量或者按时计费,门槛低。要是你的业务需要IP存活时间长一点,比如做持续性的数据监测,可以看看长效静态IP池,1到24小时可选,每日去重量10万+,IP纯净度有保障。对稳定性要求特别高、量又不大的场景,固定IP池更对口,基于云主机构建,可用率99.83%,按个数卖,省心。
几个新手特别容易踩的坑
坑一:用HTTP测HTTPS代理。你的代理是HTTPS的,但你脚本里写的是 http:// 前缀,那肯定连不上。协议前缀必须跟代理实际支持的协议一致,别想当然。
坑二:拿本地IP去测。有些代理IP其实是运营商的出口IP,你从同一个运营商网络去测,延迟会异常低,但换个网络环境就不一定了。有条件的话,换个网络(比如手机热点)再跑一遍,结果更真实。
坑三:只测一次就下结论。代理IP,尤其是动态IP,状态是随时变的。你现在测是活的,十分钟后可能就不行了。所以如果你要长期用,建议每隔一段时间跑一次,别测一次就以为永远能用。神龙HTTP那边有个人中心,能看IP使用趋势和实时监控,你不用自己反复跑脚本,后台直接看数据就行。
坑四:把"能连上"等同于"能干活"。你的测试接口可能很简单,就返回一个JSON。但实际业务里你可能要抓图片、下载文件、走复杂的请求链。建议测试的时候,除了基础连通性,再加一个带业务特征的请求(比如模拟你实际要抓的那个页面),看看代理能不能正常返回完整内容。
常见问题
Q:我手里有5000个代理IP,用这个脚本跑要多久?
取决于你的并发数和每个IP的响应速度。按上面代码默认30个线程、5秒超时来算,5000个IP大概需要5到15分钟。如果你把max_workers拉到100,能压缩到3分钟以内。但注意,并发太高可能触发代理端的限流,导致本来能用的IP被误判为超时。我的经验是每500个IP配30个线程,比较稳。
Q:测出来的可用率只有70%,是不是这批IP质量不行?
不一定。先看看失败的原因分布。如果大部分失败是"超时",而且超时集中在某几个IP段,可能是那几段线路本身有问题,不代表整批都差。如果失败原因很分散(超时、拒绝、SSL错误各占一部分),那确实可能是IP池整体质量一般。另外也检查一下你的测试环境——你本地网络有没有问题,DNS解析正不正常。排除环境因素之后,可用率还低于85%,那基本可以判定这批IP质量不达标,找服务商交涉。
Q:短效动态IP和长效静态IP,测试方法有区别吗?
测试代码本身没区别,都是"连一下、看响应"。区别在于测试的时机和频率。短效动态IP存活时间就几分钟,你测完可能它已经过期了,所以测的时候尽量在拿到IP后1分钟内跑完,别拖。长效静态IP存活几小时到一天,你测完还能用,时间上宽裕很多。固定IP就更不用急了,它基本是长期稳定的,测一次确认没问题就行。
Q:我想把测试结果存下来做记录,怎么改代码?
最简单的办法,把最后打印结果那段换成写文件。加一个 import csv,然后:
with open("test_result.csv", "w", newline="") as f:
writer = csv.writer(f)
writer.writerow(["proxy", "available", "detail"])
for p, ok_flag, detail in results:
writer.writerow([p, "是" if ok_flag else "否", detail])
跑完就生成一个CSV文件,Excel直接打开就能看。如果你测的频率高(比如每天跑一次),可以把文件名加上日期 f"test_result_{datetime.now().strftime('%Y%m%d')}.csv",方便回溯对比。
说到底,测代理IP这事儿,工具不重要,思路清楚才重要。你知道自己要验证什么、怎么判断结果、出了问题往哪个方向排查,二十行代码够用了。别被那些动不动几百行的"专业检测框架"唬住,对新手来说,能跑、能看懂、能改,就是最好的工具。


