先看一组让我肉疼的数据:去年Q3,我们内容审核系统日均处理120万条网页,用某家付费代理IP,首次请求成功率只有71.3%,平均延迟2.3秒,每天有近35万条任务要重试。换了方案后,成功率冲到99.6%,延迟降到0.8秒,重试量不到5000条。这中间的差距,就是我接下来要讲的三个坑。
踩坑一:IP池“虚胖”,首次请求成功率只有71%
当时选了一家宣称“5000万IP池”的服务商,价格便宜,0.001元/IP。测试时用API提取了1000个IP,手动curl了20个,都能通。但一上生产,批量检测网页内容合规性时,返回403的比例高达28%,还有一堆验证码。我一开始以为是目标站反爬升级,后来写了个脚本抽样5000个IP,逐个请求百度首页,发现可用率只有71.3%,很多IP早就被各大网站拉黑了。
根因是IP池“虚胖”——服务商把回收的、机房的、甚至免费代理都混在一起,更新频率跟不上。避坑方案:选型时要求服务商提供IP纯净度报告,或者自己跑一个抽样测试,连续请求目标站100次,统计成功率。同时代码里必须加自动重试和IP淘汰机制。我后来用的一段重试逻辑:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retry = Retry(total=3, backoff_factor=0.5, status_forcelist=[403, 429, 500])
session.mount('http://', HTTPAdapter(max_retries=retry, pool_maxsize=100))
# 每个请求失败后从代理池换IP,这里省略获取新IP的步骤
这个坑让我明白:付费代理IP的第一指标不是池子大小,而是可用率。
踩坑二:并发限制,QPS卡在50上不去
解决了IP纯净度后,新问题来了:内容审核要求实时性,我们目标QPS是500。但用了某隧道代理,每个隧道并发只有10,开50个隧道后账号被限速,实际QPS只有50,任务积压到第二天。我找客服,对方说“隧道代理默认并发就是10,要提工单申请”。
这个隐藏限制在购买页根本没写。后来我改用了API提取模式,自己维护IP池,用连接池控制并发。配置如下:连接池大小设为200,每个IP并发不超过5,总并发1000。实测QPS从50提升到520,延迟从1.2秒降到0.3秒。如果你也遇到并发上不去,先查服务商的隧道数限制和账号并发上限,别像我一样傻傻加机器。
踩坑三:地域标签错乱,审核结果偏差
内容审核有个特殊需求:要模拟不同地区用户访问,检测地域性合规内容。比如某些广告只在特定省份展示。我买了一家标注“城市级定位”的代理,结果抽检100个IP,地域准确率只有82%——标北京的实际出口在河北,标上海的在江苏。这导致审核结果偏差,差点让业务方背锅。
原因是部分服务商用机房IP伪装成住宅IP,GeoIP库没更新。避坑方法:要求服务商提供三大运营商住宅IP,并且支持IP归属地验证接口。我后来换了一家,抽检准确率99.5%。另外,每次请求前用ipip.net之类的接口校验一下,不对就换。
避坑方案与选型标准
三次踩坑后,我总结了一套付费代理IP的选型清单,按优先级排序:
- 可用率≥99%:抽样测试至少500个IP,连续请求目标站。
- 并发支持≥200:直接问客服并发上限,别信“无限制”。
- 地域准确率≥98%:要求提供住宅IP,支持城市级定位。
- 计费透明:按IP提取或按天计费,避免流量陷阱。
我目前用的是蚂蚁代理(mayihttp.com),在IP纯净度和城市覆盖上比较稳,动态代理0.0022元/IP起,隧道代理16元/天起,延迟<10ms。当然它不是唯一选择,但综合性价比在我这个量级(日均百万请求)够用。如果你每天跑千万级,可能需要谈独享池。
最后说个实话:没有一家代理IP能保证100%可用。关键是把重试、降级、监控做扎实。我现在每天百万请求,成功率99.6%,封禁率0.3%以下,月成本控制在3000元内。如果你也头疼IP轮换,建议先从抽样测试开始,别直接上生产。