凌晨三点,爬虫又崩了。翻日志一看,免费代理池里两百多个IP,还能打的就剩仨。叹口气,手动贴上新代理列表,重启脚本。这已经是本周第四次。
免费代理那点破毛病,我太熟了:能用多久纯看运气,有的连一次请求都扛不住,有的撑十分钟直接凉透。更气人的是,看着还活着的代理,一上生产环境立马现原形——要么慢得跟当年拨号上网似的,要么直接返回一堆乱七八糟的错误HTML。

我就一直在琢磨一个事儿:免费代理本来就这么不靠谱,能不能让爬虫自己学会“扛揍”?
代理池,真不是个存IP的列表
很多人对代理池的理解,还停留在「一个放IP的列表」。写个循环,挨个拿IP发请求,挂了就换下一个。这种写法,代理稳定时勉强能用,可碰上免费代理这种动不动死一片的,完全顶不住。
真正能用的代理池,必须有三个核心能力:检测、淘汰、补充。
检测,就是IP进池子前,先验一验到底能不能用。很多人直接网上扒代理列表,不筛就塞给爬虫。结果一百个里面有一半连不上,剩下一半慢得要死。其实加个简单验证脚本就行:拿目标网站测一下,能正常返回200、响应时间也在接受范围,再放进池子里。
淘汰,比检测更重要。一个IP今天能用,不代表明天还能用,甚至十分钟前能用,现在可能就凉了。代理池必须实时盯每个IP的健康状态,连续失败几次就标失效,直接弃用。有人喜欢把超时设成30秒,觉得稳。但实际跑起来,超过5秒才响应的代理,跟死了没区别——它会拖慢整个爬虫,让后面所有请求排队卡死。
补充,才是代理池的生命线。免费代理来得快、死得更快,靠固定列表撑不了多久。靠谱的做法是把“拿代理”和“用代理”拆开:开个独立后台线程,定时从各个免费代理站爬新IP,验证通过再补进池子。爬虫端只管取IP,不用管IP从哪来。就算某个代理源挂了,整个系统也不受影响。
重试,不是简单再发一遍请求
写爬虫的都知道要加重试,但重试做对了救命,做错了就是灾难。
最简单的重试:失败了等几秒再试一次。可免费代理的问题是,同一个IP失败一次,再试十次还是失败。正确思路就一条:重试必须强制换IP。
这里有个细节:如果代理池就几十个IP,失败一次换一个,没多久就全耗光了。更稳的是分级重试:第一次失败,换新IP重试;第二次还失败,再换;第三次依然失败,说明当前网站能用的代理太少,这时候停几秒,给代理池留点时间补新IP。
还有种更隐蔽的坑:请求成功了,但内容不对。免费代理里很多“透明代理”,不拦你请求,但会在返回的HTML里插广告,或者直接返回错误页。如果你的爬虫只看HTTP状态码,这种代理会被当成正常的。解决办法也简单:验证代理时,不只看状态码,还要检查内容里有没有预期关键词。比如爬知乎,就看页面里有没有“知乎”俩字。
并发,真不是开得越多越好
很多人有个错觉:免费代理不稳定,那我多开线程,一起跑不就完事了?
逻辑听着没错,但免费代理的带宽和稳定性摆在那,高并发只会加速代理死亡。一个普通免费代理,同时扛十几个并发,很快就会因为连接数超限被服务商封掉。
稳妥的方式是动态调并发:给每个代理设个健康分,成功加分,失败减分。分高的代理允许高并发,分低的少用甚至不用。整个系统会自动适配代理质量。
还有个常被忽略的点:请求频率。很多人爬公开数据,完全不加延时,一个接一个狂发。在目标网站眼里,这跟攻击没区别,就算用代理也躲不过。正确做法是加随机延时,让请求间隔在合理范围波动,模拟真人浏览的节奏。
异常处理,一定要分类型
免费代理报的异常五花八门,处理方式完全不一样,一锅端只会越搞越乱。
- 连接超时:IP当前不可达,直接标失效,踢出池子。
- HTTP 403:被网站封了。不是永久死,丢进“小黑屋”冷却一段时间,再拿出来重测就行。
- HTTP 429:请求太频繁被限流。这时候换IP没用,网站已经盯上你的特征了。整个爬虫暂停,等冷却完再继续。
- SSL证书错误:免费代理常见坑,服务器廉价、证书乱配。直接放弃,数据安全都没保障。
- 返回空内容/乱码:代理本身质量烂,标失效,别浪费时间。
区分异常的意义在于:有些问题换IP能解决,有些换了也没用。如果你把所有异常都当成“代理挂了”,碰到429就会陷入死循环:换一个被封一个,直到把代理池彻底掏空。
日志,是免费代理爬虫的救命稻草
免费代理爬虫最常见的死法:跑着跑着悄无声息停了。等你发现,可能已经停了几小时。没日志的话,你根本不知道是代理空了、网站反爬升级了,还是代码出bug。
一套好用的日志,至少记三样:请求成功率、代理池数量、异常类型分布。
- 请求成功率突然从95%掉到50%,说明整体出问题,要人工介入。
- 代理池IP持续下降、补充跟不上消耗,就得加代理源或调整验证规则。
- 异常分布一看就明白:403变多,大概率网站反爬升级;超时变多,就是代理整体质量崩了。
把这些指标简单可视化,再设个告警,成功率低于阈值就发通知。大部分时候你可以安心睡觉,真出事再起来处理。
免费代理不稳定,是常态;但爬虫因为代理不稳总挂,不该是常态。
把代理池从「简单列表」升级成「自维护系统」,让爬虫自己检测、淘汰、补IP;把重试从「瞎循环」改成「智能换IP+分级策略」;把并发从「越多越好」调成「动态适配」,让系统自己跟着代理质量走。
做到这三点,你的爬虫靠一堆免费代理,至少能安稳撑过一整周。
当然,你要是实在不想折腾这些破事,还有个最省事的方案:花几百块上个商业隧道代理。一个月几百块,换回连续几个月不用凌晨爬起来修爬虫的安稳觉。这笔账,怎么算都不亏。
