搜索抓取

HTTP 响应头里的抓取信号:状态码、Retry-After 与缓存策略

蜘蛛抓取时最先拿到的不是正文,而是状态码和一批响应头。这些字段决定它要不要读内容、多久后再来、这条 URL 是否继续留在抓取队列里。本文梳理 200、304、503、429 以及 X-Robots-Tag、Retry-After 的实际含义,说明响应头怎样间接影响 URL 发现的节奏,并给出一份上线前可自查的清单。

搜索抓取

HTTP 响应头里的抓取信号:状态码、Retry-After 与缓存策略

蜘蛛请求一个页面时,最先拿到的不是正文,而是状态码和一批响应头。这些字段决定了它这次要不要继续读内容、多久之后再来一次,以及这条 URL 是否还值得留在抓取队列里。不少站点把精力都放在 HTML 和内链结构上,却在响应头这一层给出了互相矛盾的信号,抓取效率自然上不去。

状态码和响应头分别管什么

状态码回答的是“这次请求成不成功”,响应头补充的是“接下来该怎么做”。前者决定这条 URL 的处理方向,后者影响抓取节奏:多久重访、要不要走缓存、某个资源能不能进入索引。两边表达的意思必须和站点真实意图一致,否则蜘蛛只能按最保守的方式处理。

200 与缓存字段

正常返回 200 的页面,如果带有合理的缓存信息,蜘蛛在两次访问之间可以复用本地副本,减少对服务器的重复请求。常见的字段是 ETag 和 Last-Modified,它们不改变抓取结果,但会影响蜘蛛重访时的判断成本。

304 不是错误

页面内容没变时返回 304,等于告诉蜘蛛“内容还是旧的”。蜘蛛会据此更新这条 URL 的抓取记录时间,而不是重新处理一遍正文。304 越稳定,说明站点更新越可控,蜘蛛安排下一次来访也越有把握。

反过来,如果每次请求都生成不同的 ETag,而内容其实没变,蜘蛛会误判页面在频繁更新,反复回抓,把抓取额度花在没有变化的内容上,新 URL 的排队时间就被拉长了。

503 与 Retry-After:维护窗口的用法

计划内停机、数据库迁移、临时过载时,直接返回 403 或 404 会被理解成“内容没了”,已有的抓取记录可能被逐步清理。更合适的做法是返回 503,并在 Retry-After 中写明预计恢复时间,比如 Retry-After: 3600。

要注意,长时间持续的 503 同样会让蜘蛛下调抓取频率。维护窗口尽量可预期,恢复后主动确认页面能正常返回 200。

X-Robots-Tag:不索引和不抓取是两件事

robots.txt 里的 Disallow 表示“别抓”,响应头里的 noindex 表示“可以抓,但别放进索引”。很多人把这两件事混在一起讨论,结果出现“被禁止抓取又指望被索引”的矛盾配置。

对于 PDF、图片、音视频这类没法写 meta 标签的文件,X-Robots-Tag 是少数可控手段之一。需要它出现在索引里就别加 noindex,需要它不出现就加上,逻辑要针对具体资源想清楚。

连续 5xx 与 429

服务器稳定性直接影响 URL 发现的速度。短时间集中出现 5xx,蜘蛛通常会减慢请求频率并稍后重试;如果错误持续存在,主机级别的抓取速率会被下调,新 URL 进入队列的速度也跟着变慢。

429 表示请求过多,配合 Retry-After 使用比直接拒绝更清晰。它多数出现在抓取速率明显超过站点承受能力时,可以先检查是否被内部工具或其他爬虫叠加了压力。

回到 URL 发现这件事

无论一条 URL 是从 Sitemap、内链还是站内搜索被发现的,最终都要经历“请求—判断—排期”这一步。响应头稳定,蜘蛛才有信心按正常速率安排下一批地址;响应头忽好忽坏,抓取就会退回保守模式,新页面被发现的时间随之拉长。

响应头不需要写得多复杂,但同一类 URL 的表达要一致:状态码说明结果,缓存字段说明变化,限速字段说明节奏。

上线前可以核对一遍

  1. 重要页面是否稳定返回 200,而不是偶尔夹带 5xx 或超时。
  2. 内容未变时是否返回 304,ETag 是否随内容真正变化而变化。
  3. 维护期间使用 503 加 Retry-After,而不是直接 403 或 404。
  4. 私密或重复资源用 X-Robots-Tag 处理时,是否与 robots.txt 意图一致。
  5. 突发流量导致的 429 是否有明确的重试提示,而不是长时间拒绝。
  6. Sitemap 与内链指向的地址,是否都能稳定拿到期望的状态码。

把这几项对齐之后,蜘蛛拿到的信号会清晰很多。抓取节奏稳了,URL 发现和后续抓取才有机会按正常步调推进,剩下的工作才是内容和结构层面的优化。