搜尋抓取

304 與條件請求:蜘蛛重复訪問同一 URL 时怎么回應

蜘蛛重复訪問同一 URL 时,往往會先發條件請求。服務器返回 304 還是 200,取决于 Last-Modified、ETag 等响應头是否稳定。本文梳理條件請求的机制、常见配置坑,以及它與抓取预算的關系,帮助站点减少重复传輸和誤判更新。

搜尋抓取

304 與條件請求:蜘蛛重复訪問同一 URL 时怎么回應

蜘蛛不是只来一次。一個 URL 被發現後,會在一段時間内被反复訪問。但反复訪問不等于反复完整下载。很多搜尋引擎蜘蛛在第二次、第三次訪問时,會先發一個條件請求,询問服務器内容有没有變化。理解這段交互,能减少不必要的传輸,也能避免让蜘蛛誤判頁面更新频率。

條件請求是怎么發出来的

当蜘蛛第一次抓取某個 URL 时,服務器通常在响應头里带上 Last-Modified 或 ETag。下次蜘蛛再訪問同一個 URL 时,請求头里就可能出現:

  • If-Modified-Since:對應 Last-Modified,告诉服務器“我上次抓到的時間是這個”。
  • If-None-Match:對應 ETag,告诉服務器“我上次拿到的标识是這個”。

服務器收到後,可以判断内容是否變化。如果没變,返回 304 Not Modified,正文不传輸;如果變了,返回 200 和新的正文。

304 對蜘蛛意味着什么

304 不是“不抓取”,而是一次有效的訪問记錄。蜘蛛確認 URL 可訪問、狀態正常,但不需要重新下载和解析正文。對站点来说,這能减少带宽和服務器压力;對蜘蛛来说,也能把省下的传輸時間用在其他 URL 上。

把 304 当成“拒绝抓取”是一種誤解。它只是告诉蜘蛛:内容没變,不用再传一遍。

配置时容易踩的坑

Last-Modified 不稳定

有些程序在每次請求时動態生成 Last-Modified,或者时区處理不對,導致每次返回的時間都不一样。蜘蛛會以為頁面一直在更新,于是反复完整抓取,反而增加消耗。

ETag 每次都變

部分框架會用文件 inode、進程 ID 或随机值拼 ETag。同一份内容在不同請求里得到不同 ETag,條件請求就永遠對不上,304 也就無法生效。

CDN 與源站响應头不一致

如果源站返回了稳定的 ETag,但 CDN 层又覆盖或剥离了相關头,蜘蛛在不同時間可能看到不同版本。需要確認最终到達客戶端的响應头是否稳定。

和抓取预算的關系

304 能节省传輸,但不會凭空增加蜘蛛的抓取配額。蜘蛛仍然要為這次訪問排队、建连、等待响應。真正影响抓取量的,還是 URL 發現是否充分、站点响應是否稳定、抓取路径是否清晰。條件請求更像是锦上添花:让重复訪問更轻,而不是让蜘蛛来得更勤。

一個简單的检查清單

  1. 用 curl -I 连續請求同一個 URL,观察 Last-Modified 和 ETag 是否稳定。
  2. 在日誌里統計 304 的比例。如果長期為零,可以检查是否响應头配错或被中間层改掉。
  3. 確認 404、410 等失效頁面不要返回 304,避免蜘蛛誤以為它們仍然有效。
  4. 對需要實时更新的頁面,不要强行長期返回 304;對稳定頁面,則适合让缓存头正常工作。

條件請求不是抓取優化的核心,但它属于服務器與蜘蛛之間最基础的對话。把响應头配稳,蜘蛛重复来訪时就能少下载、少折腾,站点也能把资源留给更需要的請求。