入口页的状态码看起来只是服务器层的细节,但它直接影响蜘蛛下一次还愿不愿意来。同一批入口页里,如果错误码给得随意,蜘蛛会把“暂时读不到”理解成“这里没有东西”,把“永久下线”理解成“过段时间再来看看”,结果就是抓取预算被反复浪费在同一个地址上。
状态码在蜘蛛眼里意味着什么
蜘蛛不读你的心情,只读响应头里的三位数。它决定要不要保留这个 URL、要不要降低抓取频率、要不要稍后重试,基本都靠这个数字。所以入口页的状态码要尽量表里如一:页面是什么状态,就给什么码。
200 与 304:常态与未变
内容正常就返回 200。已经抓过的地址,如果 HTML 没有变化,用 Last-Modified 或 ETag 让蜘蛛收到 304,能省下带宽,也省下蜘蛛的解析时间。入口页数量大的时候,这一项对整体效率的影响比想象中明显。
404 与 410:不在,和确定不在
404 表示暂时找不到,410 表示已经永久移除。410 的信号更明确,蜘蛛通常会更快地把这个地址从待抓队列里划掉。但前提是真的不再用了——如果过几天又把同一个地址放出来,反而会让蜘蛛困惑。拿不准就先给 404。
301 与 302:换地址的两种情况
入口页换域名或换路径,用 301 把抓取顺势带过去;只是临时切换,用 302。跳转链要短,最好一跳到位,连续多跳几次,蜘蛛走到一半就可能放弃。
429、503 与 5xx:别用错误码掩盖问题
服务器扛不住时返回 503 是合理的,但不要长期挂着 503 当作停机保护。5xx 属于服务器侧的问题,蜘蛛会降低抓取频率并稍后重试;长期 5xx 会让一批入口页被冷处理。429 更适合“抓太快了,慢一点”的场景,而不是把所有异常都丢成这一个码。
软 404 与“友好错误页”
最容易被忽略的是软 404:页面内容已经写明“该内容不存在”,状态码却依然返回 200。蜘蛛无法区分这是空壳还是正常页,只会反复来抓。同样,“友好的错误页”如果返回 200 并带一堆导航和推荐链接,等于在批量制造低质量入口页。
实操上的几条建议
- 批量检查响应头:定期用脚本拉一遍入口页的头部信息,把状态码异常的单独挑出来,别只看页面能不能打开。
- 区分暂时与永久:临时维护给 503,别顺手给 404;真不做了就给 410,别一直挂 404。
- 错误页要短:自定义错误页不要塞满内链和推荐位,蜘蛛会把它当成正常页面继续往里爬。
- 日志对照着看:状态码分布和访问日志一起读,才能判断蜘蛛是没来,还是来了吃了闭门羹。
- 策略保持稳定:同一批入口页的状态码规则别频繁切换,蜘蛛需要的是稳定信号。
状态码是给蜘蛛看的最直接的一句话,说清楚比说好听重要。
最后提醒一点:状态码本身不解决内容问题。入口页能不能被持续抓取,归根到底还是看页面有没有值得抓的东西。状态码的作用,只是让这个过程少一些误会。