搜尋抓取

搜尋蜘蛛抓取:條件請求與缓存头異常造成的回訪抓取空轉排查

搜尋蜘蛛回訪时會带 If-None-Match 或 If-Modified-Since,服務器返回 304 可减少重复下载。若 ETag 不稳定、始终返回 200 或 CDN 與源站缓存头不一致,回訪抓取容易空轉,挤占抓取预算。本文梳理核對顺序與修复建议。

搜尋抓取

搜尋蜘蛛抓取:條件請求與缓存头異常造成的回訪抓取空轉排查

搜尋蜘蛛對已经抓取過的 URL 通常會安排回訪。為了减少重复传輸,蜘蛛在回訪时會带上 If-None-MatchIf-Modified-Since 請求头,询問頁面是否發生變化。如果服務器能正确返回 304,蜘蛛只需確認“没有更新”,不必再次下载完整正文;如果响應头或缓存策略異常,蜘蛛可能每次都拿到 200 和完整内容,造成回訪抓取空轉,挤占有限的抓取预算。

條件請求在抓取回訪中起什么作用

可以把條件請求理解為一次轻量確認。蜘蛛首次抓取後會儲存响應的 ETag 或 Last-Modified。下次訪問时,它把這些值放回請求头。源站如果判断资源未變,返回 304 Not Modified,並允许不带正文;如果已變,則返回 200 和新内容。這個過程對站点运营的價值在于:减少服務器带宽消耗,也让蜘蛛把時間花在真正更新的 URL 上。

容易造成空轉的几種响應異常

  • 始终返回 200:源站不识別條件請求头,無论内容是否變化都重新輸出完整頁面。
  • ETag 不稳定:ETag 中包含時間戳、随机串或每次請求都變化的進程 ID,導致蜘蛛每次拿到的标识都不同。
  • 304 响應头缺失:返回 304 却没有配套的 ETag,或狀態碼寫成 200 但正文為空,蜘蛛难以判断抓取结果。
  • CDN 與源站不一致:邊缘节点返回一套缓存头,回源後又拿到另一套 Last-Modified,造成版本判断混乱。
  • Vary 头缺失:同一 URL 因 User-Agent、Accept-Encoding 返回不同内容,缓存系統却按同一版本處理。

排查顺序與核對方法

  1. 先挑選更新频率不同的頁面,分別用 curl -I 請求,记錄首次响應的 ETag、Last-Modified 和 Cache-Control。
  2. 带上首次拿到的 If-None-Match 或 If-Modified-Since 再次請求,观察是否返回 304;如果返回 200,检查响應正文長度是否與首次一致。
  3. 對同一 URL 连續請求多次,確認 ETag 是否保持不變。若每次變化,需要检查生成逻辑。
  4. 分別直连源站和经過 CDN 請求,比較两邊的响應头,尤其是 Age、Via、X-Cache 等字段。
  5. 在服務器訪問日誌中查看蜘蛛回訪时返回的狀態碼分布,確認 304 占比是否合理。

修复與配置建议

優先让源站輸出稳定的驗證标识。對静態文件,可用文件修改時間或内容摘要生成 ETag;對動態頁面,如果内容由資料库和模板共同决定,可以用影响輸出的字段更新時間生成 Last-Modified。確認未變化时,返回 304 並且不發送正文。CDN 侧要统一缓存策略,避免邊缘节点把不同版本混在一起。

需要提醒的是,304 不是“少抓取”的技巧。如果頁面内容已经變化却仍返回 304,蜘蛛會繼續使用舊版本,反而影响 URL 發現和内容更新。條件請求的目标是准确反映變化,而不是隐藏變化。

與 Sitemap 和内鏈發現的關系

Sitemap 的 lastmod 和頁面响應头應尽量一致。若 Sitemap 声明某頁近期更新,但服務器回訪时一直返回 304,蜘蛛可能降低對该 Sitemap 時間戳的信任。内鏈结构則决定蜘蛛能否稳定到達這些 URL;即使缓存头配置正确,入口本身抓不到也無法完成回訪。因此排查顺序通常是:先確認 URL 可發現,再確認服務器可達,最後核對條件請求和缓存头是否让回訪有效。

抓取预算不是靠單一响應头节省出来的,而是入口發現、服務器稳定性和内容更新信号共同作用的结果。條件請求配置正确时,它只是让回訪更准确,不會自動提升收錄或排名。