小张今天又抓狂了。他写了一个爬虫,每天从某个代理IP供应商的API接口拉取几千个IP,用来抓取电商网站的数据。可运行了不到半小时,程序就开始疯狂报错——连接超时、请求被拒、目标网站返回403……一检查,好家伙,拉回来的IP有一大半都是死的。
这不是个别现象。很多人调用API获取IP池、CDN节点、DNS解析结果时,都会遇到类似的问题:接口返回的数据看起来很丰满,实际用起来却很骨感。
那问题来了:API已经返回了IP列表,我们还能做什么来二次验证它们的有效性?

先搞清楚“失效”到底指什么
所谓“失效IP”,至少分三种情况:
彻底死了:ping不通,端口没响应,连都连不上。
活着但没用:能连通,但被目标网站封了,返回验证码或直接拒绝访问。
慢到等于失效:响应时间超过3秒,你的业务根本等不起。
三种情况的验证方式不一样,别想用一个方法通杀。
二次验证的三个层次
第一层:快速连通性检查
拿到IP列表后,不要直接用,先做个“体检”。
最简单的做法:用TCP连接测试,只判断端口是否开放,不交换任何业务数据。比如你要用代理IP访问http://example.com,那就先测试这个IP的1080端口(假设是SOCKS代理)能不能连上。
关键点:设置超时时间,1秒连不上就标记失败。你是在验证几百几千个IP,不是在做精确测量。
很多人踩过的坑:用ping来测试。但很多服务器禁ping,ping不通不代表不能用。直接用目标端口做TCP握手更靠谱。
第二层:业务级验证
连通了就能用吗?很多代理IP能连上,但一访问目标网站就被识别出来了。这时候需要“模拟请求验证”。
具体做法:用这个IP去请求目标网站的一个简单页面,比如https://www.example.com/health或者s.taobao.com/search?q=test。检查返回的HTTP状态码和响应内容。
- 返回200且内容正常 → 通过
- 返回403、429、503 → 被限制了,标记失效
- 返回一个验证码页面 → 失效
- 超过3秒才返回 → 根据你的容忍度判断
一个小技巧:不用每次都用完整请求。HEAD请求就够了,只拿响应头,不拿正文,省流量也省时间。
第三层:稳定性观察
有些IP今天能用,明天就死了。更恶心的是——同一个IP,上午快如闪电,下午慢如蜗牛。
二次验证不应该是一次性的。你需要对“活着的IP”做持续观察。
最简单的做法:给每个IP记录最近5次验证的平均响应时间和成功率。连续失败2次就踢出可用池,连续3次响应超过阈值就降级备用。
这就像交朋友,第一次见面聊得不错,不代表以后每次合作都靠谱。多观察几次再做判断。
实际执行的三个要点
控制并发,别把自家服务器打爆。验证1000个IP,如果一个个串行跑,每个耗时1秒,那要等快17分钟。等验证完,第一批验证通过的IP可能又失效了。
所以要用并发。但同时开几百个验证线程,小心你本地网络先扛不住。推荐分成小批次,每次并发10-20个,批次间隔半秒。
别只依赖一个验证目标。很多人的验证逻辑是:用这个IP去请求百度首页,能通就算有效。但这只能说明它能访问百度,不代表能访问你要的那个电商网站。
建议至少验证两个目标:一个是公网通用目标(比如http://httpbin.org/ip),一个是你的实际业务目标。两个都通过才算有效。
把验证结果存下来。你每次验证的结果,都不是白做的。记录下每个IP的成功率、响应速度、失败原因,慢慢就能摸出规律:
- 是不是某个IP段整体质量很差?
- 是不是某个时段拿到的IP特别容易失效?
- 是不是某个供应商的API在下午三点准时“放水”?
这些数据能反过来帮你调整拉取API的策略,从源头减少无效IP的比例。
总结
API告诉你这个IP可用,那只是供应商的意思。你的业务认不认可,得你自己试过才知道。
当然,验证是有成本的——耗时、耗流量、占系统资源。所以别做过度验证。根据你的实际业务场景,选择上面三个层次中的一两个组合使用就够了。
小张后来是怎么解决的?他写了一个验证中间件,每次从API拉完IP后,先做TCP连通测试过滤掉六成死IP,再用HEAD请求业务验证过滤掉两成被封IP,剩下两成交给程序使用。虽然每次会多花十几秒验证时间,但程序的成功率从40%提到了85%以上。这十几秒,花得值。
