搜索抓取

状态码是给蜘蛛的即时反馈:4xx、5xx 与超时怎样改变抓取安排

蜘蛛每次抓取都从看服务器怎么回答开始。成功、确定性失败和临时失败三类响应,会分别影响 URL 的保留、清理与再抓频率。本文梳理 404、410、403、5xx、429 与超时对抓取路径的实际作用,并给出按状态码自查日志的思路。

搜索抓取

状态码是给蜘蛛的即时反馈:4xx、5xx 与超时怎样改变抓取安排

蜘蛛抓取一个 URL 时,第一步不是解析内容,而是看服务器怎么回答。状态码是这次请求的结论,也是决定它下次还来不来、什么时候来、会不会顺着这个地址继续走的输入。很多抓取上的别扭,其实来自响应给错了信号。

三类响应,三种处理逻辑

从抓取调度的角度看,状态码大致可以分成三组:200 与可跟随的 301、302 属于第一组;404、410 属于确定性失败;5xx、429 和超时属于临时失败。蜘蛛对三者的处理完全不同:第一组继续解析页面、提取链接;第二组把 URL 标记为失效,逐步降低再抓频率;第三组保留 URL 的待抓状态,隔一段时间重试,同时可能整体下调对该站点的抓取速度。

4xx:告诉蜘蛛这个地址不用再来

404 是最常见的确定性失效信号。页面确实删除了,返回 404 或 410 都合适;410 的语义更强,表示永久移除,部分蜘蛛会更快地清理。这里有两类常见误用:

  • 页面不存在却返回 200,配一句“抱歉,没有找到内容”。这类软 404 会让蜘蛛把空页面当作正常内容处理,既占抓取预算,也让本该失效的 URL 长期留在队列里。
  • 把已删除的页面 301 到首页。用户侧看着有去处,但蜘蛛看到的是大量 URL 指向同一目标,跳转关系变得模糊,首页也会被以各种入口反复访问。

403 和 401 指向权限问题。如果站点按 IP 或 UA 做了拦截,蜘蛛拿到的可能就是 403。这时它不会把 URL 判为失效,但抓取会一直不顺畅,反复尝试而不产生结果。

5xx:临时失败,但代价会累积

500、502、503、504 表示服务器这次没有正常完成响应,蜘蛛通常按临时问题处理,保留 URL 并安排重试。问题在于重试不是无限的:同一批 URL 连续多次返回 5xx,蜘蛛会开始降低对该站点的整体抓取频率,恢复速度取决于后续响应有多稳定。计划内维护时,503 配合 Retry-After 头是比较明确的表达方式,比让请求长时间挂着更清楚。

429 与超时:不是坏了,而是太快了

429 表示请求频率超出服务器愿意接受的范围,它传递的是“慢一点”,而不是“这个地址有问题”,蜘蛛通常据此下调抓取速率。连接超时、读超时、连接被重置在日志里不一定体现为标准状态码,但效果类似:这轮抓取视为失败,过一段时间再试。

如果超时集中出现在某些目录或某类模板生成的页面上,往往说明这些页面在数据库查询或外部接口调用上卡住了,而不是整站不可用。定位到具体模板,比笼统地加服务器资源更有针对性。

维护窗口内的临时不可用,用 503 加 Retry-After;被压垮的接口,用 429 或明确的限流说明。都不要用长时间无响应的方式表达。

按状态码自查的几条路径

  1. 把服务器日志按状态码分组统计,看 5xx 和 429 集中在哪些路径、哪些时段。
  2. 检查是否存在大量 404 返回 200 的情况,重点看站内搜索页、筛选页、已删除的内容页。
  3. 抽查重定向链,确认删除页面不会被统一指向首页或某个无关栏目页。
  4. 观察 5xx 是否与流量高峰、批量任务、备份或密集访问时间重叠。
  5. 如果站点有抓取统计面板,把其中的响应错误趋势与服务器日志对照,确认两者描述的是同一件事。

小结

蜘蛛对站点的判断是一点点累积的。稳定返回 200 的页面容易被安排更规律的抓取,大量临时错误则会拉低整个站点的抓取节奏。把状态码当成给蜘蛛的即时反馈,让每种结果都对应准确的语义,URL 发现的过程会顺畅得多。