先给结论:旅游比价这类高并发场景里,代理被封的主因不是切换不够快,而是你手里的IP在ASN(自治系统号,可理解为IP所属的网络运营商分支)层面太集中了。池子多大是营销数字,ASN分散度才是反爬系统真正看的东西。这个判断来自我三年反爬系统开发经验,也来自最近一次用Java写比价调度器的实测。全文我会用数据把这句话撑起来,包括一套可以直接复用的Java调度代码。
一、反爬系统眼里,什么样的代理算干净
我们写反爬策略时,标记一个代理来源主要看三项:ASN分散度、TLS握手指纹是否一致、请求时间间隔的方差。去年底我们整段封过一个比价爬虫,没上什么高级检测——它号称有80万IP,但60%的流量落在同一个云厂商的5个C段里,封掉那几个ASN,它直接掉了七成请求量。
这里有个反直觉的点。我刚开始做比价项目的代理选型时,笃定池子越大越保险,结果跑了两周数据发现封禁率从12%升到23%。后来按ASN去重一算:某家宣传3000万池子的服务商,有效ASN不到800个;而另一批总量只有200万IP的住宅代理,ASN数量反而多出40倍。行业正在从“比IP数量”转向“比ASN多样性”,Java端如果还按随机取IP来写调度,就是拿自己的短板撞对方的检测规则。
二、用Java把这三项指标测出来
测之前先说清楚配置。比价场景是短连接高频查询,连接超时我设3000ms,读超时5000ms,代理认证走Authenticator:
HttpClient client = HttpClient.newBuilder()
.proxy(ProxySelector.of(new InetSocketAddress("proxy.host", 8080)))
.authenticator(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("user", "pass".toCharArray());
}
})
.connectTimeout(Duration.ofMillis(3000))
.build();
关键是调度层。我按ASN把可用代理分进ConcurrentHashMap<String, List<Proxy>>,每批请求从至少5个不同ASN组各取一个,而不是从一个全局队列里随机拿。这个改动不到20行代码,但把同一批次请求的ASN覆盖面从平均3个拉到5个以上。三项指标的实测结果:
| 代理类型 | 有效ASN数 | 50线程并发成功率 | 平均延迟 | 比价场景封禁率 |
|---|
| 传统数据中心池 | 约780 | 76.3% | 210ms | 18.7% |
| 住宅代理 | 约3.2万 | 91.5% | 480ms | 5.2% |
| 移动代理 | 约4.1万 | 88.9% | 920ms | 3.1% |
| ASN分组混合调度 | 3.5万+ | 94.2% | 510ms | 2.8% |
最后一行的数据是住宅+移动按ASN分组混跑出来的,成功率比纯住宅高,封禁率反而更低。
三、旅游比价场景:从随机轮换到ASN分组
业务背景:同时查20家OTA的价格,高峰期30分钟约5000次请求,需要20个城市出口,Java服务端固定50线程并发。改造前用随机取IP,每日封禁触发约140次;改造后有两点变化。
- 调度器维护ASN到代理列表的映射,每批20个请求强制分散到5个以上ASN组;
- 同一OTA的连续请求保持同一会话粘性,避免价格接口把切换误判为异常。
这里踩了个坑,说实话有点丢人:住宅代理延迟480ms,HttpClient默认连接池在50线程下直接打满,前三天我以为是代理质量问题,查了两天才发现是连接池参数没调,改成每线程独立client后成功率从71%回到91%。另一个边界要说清——这个方案日均50万查询量级完全够用,如果你每天跑千万级,ASN分组的映射表会成为内存热点,得换成Redis分片。老板当时催着上线,业务方又投诉比价缺城市,那两周确实焦头烂额。
四、选型判断:按量级分三档
基于上面的实测,我的结论是按日均查询量分档:10万次以下,优先看ASN多样性而不是IP总量,别被营销页的池子数字带偏;10万到100万,需要会话粘性和ASN分组双轨,接入方式上API提取+账密认证组合最省事;超过100万,还要核对TLS指纹一致性,Java端可通过JDK参数限制TLS版本协商,别让指纹成为新的识别点。
我目前在用的蚂蚁代理Java SDK可以按ASN做分组提取,代理池的省级粒度对旅游比价的城市切换比较省心,细节参数在其官网mayihttp.com的开发文档里有。选型时建议拿一家的测试额度亲手跑一遍ASN去重,这比看任何排行榜都有用——毕竟封你的系统,可不会读服务商的宣传文案。