蜘蛛池知识

蜘蛛池的 CDN 與缓存层:蜘蛛在不同节点上可能拿到不同頁面

入口站挂 CDN 很常见,但缓存配置随意时,蜘蛛從不同节点拿到的 HTML 可能並不一致:舊版本、被改造過的版本、甚至被缓存的错誤頁都會出現。本文梳理缓存影响抓取的几種典型情况,给出對比排查方法和入口頁的缓存配置建议。

蜘蛛池知识

蜘蛛池的 CDN 與缓存层:蜘蛛在不同节点上可能拿到不同頁面

不少蜘蛛池入口站為了扛訪問量、分散 IP,會把域名挂到 CDN 或前置一层反向代理。這本身没有問题,但缓存一旦配得随意,蜘蛛從不同节点看到的就可能是不同版本的頁面——你在源站改過的東西,蜘蛛未必看得到。

缓存命中时,蜘蛛看到的是上一次的頁面

蜘蛛請求入口頁时會带上自己的 UA,但多數 CDN 預設並不区分 UA,缓存的是第一個触發回源的版本。如果這個版本来自普通訪客訪問,比如带地域跳轉、带活動横幅的 HTML,蜘蛛拿到的就是這份被改造過的内容。

  • 頁面主体内容與源站不一致,連結被條件判断吞掉
  • 本该跳轉的頁面被缓存成 200,源站其實已经 404
  • 頁面里的外鏈被替換成本地域名,锚文本對不上

节点差异:同一個 URL,不同机房不同结果

CDN 是分节点缓存的。回源時間與過期時間不一致时,A 节点可能已经是新版本,B 节点還是几天前的舊版本。蜘蛛被調度到哪個节点並不由你决定,于是日誌里的抓取结果时好时坏,很难复現。

如果同一入口頁在日誌里出現两種完全不同的抓取结果,先別急着怀疑蜘蛛,先查缓存。

缓存污染:不该被缓存的响應被存了下来

  1. 源站返回 5xx 或 302,被 CDN 按错誤缓存策略存了一個周期,蜘蛛反复拿到同一個错誤。
  2. 带查询參數的 URL 大量生成缓存副本,等于给蜘蛛造了一批内容相同的重复頁。
  3. 缓存键没带 Vary: User-Agent,移動版與桌面版互相覆盖,只留最後一份。

對比排查的几步

  • 用多地拨测工具或指定节点 IP 抓取,横向比對响應体是否一致。
  • 看 X-Cache、Age、CF-Cache-Status 這類响應头,確認命中的是缓存還是源站。
  • 临时關掉缓存直连源站,先確認源站本身輸出正确,再回来看缓存层。
  • 在日誌里按 URL 聚合,观察同一頁面的响應長度是否稳定。

入口頁的缓存配置建议

入口頁通常量不大、變化不频繁,其實没必要做長缓存。比較稳妥的做法是:

  • 入口頁 HTML 设短缓存或不缓存,源站更新後主動 purge,別等自然過期。
  • 静態资源可以長缓存,但 HTML 不要跟着一起長缓存。
  • 缓存键区分移動端與桌面端,避免两種版本互相覆盖。
  • 明确 404、5xx、跳轉的缓存策略,別让错誤頁面長期驻留。

什么时候可以放心缓存

如果入口頁是纯静態、内容基本不變、没有地域跳轉和登入態,缓存能明顯减轻源站压力,對蜘蛛的响應也更稳定。反過来,只要頁面有一處會随訪客變化,缓存就要格外小心,通常宁可让它回源。

缓存不是收錄開關,它只决定蜘蛛看到什么。看到的是不是你想让它看到的,這件事得自己確認。