搜尋抓取

缓存與蜘蛛:它抓到的頁面版本,可能不是你刚發布的那一版

蜘蛛抓取时拿到的頁面,可能来自 CDN 或服務器缓存,而不是刚更新的源站版本。本文說明缓存對抓取速度與内容新鲜度的两面影响,以及 Vary 头、缓存時間、刷新方式等容易被忽略的细节,並给出一份更新後確認蜘蛛讀到新版的检查清單。

搜尋抓取

缓存與蜘蛛:它抓到的頁面版本,可能不是你刚發布的那一版

做站点运营时,常见的困惑是:頁面明明已经更新,蜘蛛再来抓的时候拿到的却還是舊内容。這種情况往往不是蜘蛛没来,而是它来了,却從缓存里拿到了一份過期版本。理解缓存這一层,能让 URL 發現和後續抓取少走很多弯路。

蜘蛛請求的那個頁面,是谁返回的

当蜘蛛請求一個 URL,响應可能来自三處:源站服務器、CDN 邊缘节点,以及中間的缓存层。蜘蛛最终拿到的 HTML,取决于這次請求命中了哪一层。對蜘蛛来说,這几层的差別它並不關心,它只看最终返回的狀態碼和正文。日誌里顯示抓取成功,並不代表抓到的就是最新版本。

缓存命中對抓取的两面影响

  • 正面:缓存命中时响應更快,蜘蛛在同样的時間窗口里能處理更多 URL,抓取過程也更稳定,源站不容易因為压力出現 5xx。
  • 负面:如果缓存時間設定過長,或者更新後没有主動刷新,蜘蛛會反复拿到舊頁面,新連結、新内容迟迟進不了下一轮抓取。

換句话说,缓存既影响抓取速度,也影响内容的新鲜度,這两件事需要分開来看。

几處容易被忽略的缓存细节

Vary 與 User-Agent

有些站点會按 User-Agent 返回不同内容,並在响應头里声明 Vary。一旦缓存层按這個規則拆分副本,蜘蛛拿到的版本可能和普通訪客不同。更麻烦的是,同一台邊缘节点上可能混存了多個版本,蜘蛛几次抓取拿到的正文不一致,頁面内容的判断就變得不稳定。

缓存過期時間與更新节奏

缓存時間设得越長,源站压力越小,但内容變更被蜘蛛發現的延迟也越長。首頁、列表頁這類更新频繁的頁面,通常不适合和詳情頁用同一套缓存策略。詳情頁可以放長一些,聚合頁和入口頁則應该更短。

多級缓存下的刷新

更新内容後,只刷新了 CDN 而没有處理源站缓存,或者只刷新首頁而漏掉了列表頁,都會让蜘蛛在新的抓取轮次里仍然讀到舊連結。刷新動作最好和發布流程绑定,而不是靠人工想起来再操作。

更新後,让蜘蛛更快讀到新版

  1. 發布完成後按頁面類型逐层刷新:詳情頁、列表頁、首頁依次處理。
  2. 先確認源站返回的是新内容,再检查邊缘节点返回的版本,避免只刷新了一层。
  3. 核對缓存時間配置,對更新频繁的 URL 單獨設定較短的過期時間。
  4. 對照服務器日誌與回源日誌,確認蜘蛛的請求到達了哪一层。
  5. 如果内容确實變了,不要長期依赖缓存自動過期来推動更新。
缓存問题的一個典型表現是:站内检查看起来一切正常,但從抓取日誌看,某些 URL 返回的正文始终是同一段舊文本。這时先查缓存,往往比反复改内容更有效。

日常自查的几件小事

  • 上线新頁面後,用不同来源分別請求一次,對比正文是否一致。
  • 確認重要頁面的缓存時間,和它們的更新频率是否匹配。
  • 记錄每次刷新缓存的時間点,與抓取日誌對照,看新版内容多久被讀到。
  • 如果站点用了多級缓存,注意是否存在只在某一层刷新的情况。

缓存並不是抓取之外的话题,它决定了蜘蛛每一次請求究竟讀到了什么。把這一层理顺,URL 發現和内容更新才會按预期推進。