搜尋抓取

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 發現和後續抓取才有机會按正常步調推進,剩下的工作才是内容和结构层面的優化。