搜尋抓取

CDN 缓存與蜘蛛抓取:蜘蛛看到的頁面為什么和你不一样

很多站点接入 CDN 或反向代理後,會出現蜘蛛抓到舊頁面、频繁遇到 403 或驗證頁的情况。問题常出在缓存版本不一致、防護层拦截和狀態碼被改寫上。本文從缓存命中、缓存分裂、回源狀態碼几個角度說明它對抓取节奏的影响,並给出一套排查與處理思路。

搜尋抓取

CDN 缓存與蜘蛛抓取:蜘蛛看到的頁面為什么和你不一样

很多站点在接入 CDN 或反向代理之後,會碰到一種情况:自己在浏览器里看到的頁面是新的,日誌里蜘蛛抓到的却是舊版本;或者普通用戶訪問正常,蜘蛛那一侧却频繁出現 403、超时和驗證頁面。問题往往不在頁面本身,而在蜘蛛和你之間多出来的那一层缓存與防護。

蜘蛛抓到的和你看到的,可能不是同一份 HTML

CDN 的預設逻辑是就近返回缓存。节点上的副本有各自的 TTL,也有各自的淘汰策略,不同节点、不同地区的缓存狀態並不一致。蜘蛛從不同 IP 段發起抓取,命中的可能是 A 节点的新副本,也可能是 B 节点的舊副本。如果頁面刚更新、缓存又没過期,蜘蛛就拿不到新内容,抓到的連結和文本都停留在上一版。

更麻烦的是缓存分裂:有些配置會按 UA、Cookie、查询參數生成不同的缓存键。蜘蛛没有 Cookie、UA 相對固定,命中的缓存桶和普通用戶不同,于是出現用戶能看到的内容、蜘蛛看不到的情况,而日誌里狀態碼還是 200,從表面上完全看不出異常。

缓存命中率會影响抓取节奏

缓存命中时响應通常在几十毫秒,回源慢时可能几百毫秒甚至超时。蜘蛛在單位時間内的抓取量,和服務器响應速度直接相關:同样的時間窗口里,响應快,翻過的 URL 就多;响應慢、频繁超时,抓取频次會相應被压下来。這属于正常结果,不是针對某個站点的惩罚,但會實實在在拖慢新頁面的發現速度。

所以缓存层對抓取的影响有两面。命中率高、回源稳定,等于给蜘蛛让出了更多抓取空間;缓存穿透嚴重、回源抖動,抓取效率和稳定性都會打折。

三個常见問题

一、缓存返回舊版本

  • 内容更新後没有主動刷新缓存,蜘蛛短期内反复抓到舊 HTML。
  • 缓存 TTL 過長,新連結在舊副本里根本不存在,蜘蛛自然發現不了。
  • 不同节点 TTL 不一致,蜘蛛在不同時間看到的内容對不上。

二、防護层拦住了蜘蛛

有些 WAF 或安全策略預設只放行浏览器特征明顯的請求,對陌生 UA 直接返回 403、人机驗證頁或跳轉。蜘蛛拿到的就是這類响應,頁面正文一個字都讀不到。表現是:日誌里蜘蛛請求不少,但狀態碼集中在 403、429、503,抓取覆盖始终上不去。

三、狀態碼在传递中被改寫

源站返回 404 或 301,经過缓存层後有时被替換成 200 加一個空頁面或错誤提示頁。蜘蛛看到 200,就把這個 URL 当作正常頁面處理;下次再来還是同一份空内容,反复几次之後,這個 URL 在抓取里就變成了低價值目标。這類問题排查成本不低,但影响很直接。

怎么排查

  1. 在服務器和 CDN 两侧各看一遍日誌,重点比對蜘蛛 UA 的狀態碼、响應時間和回源比例。
  2. 用同一個 URL 分別以普通訪問和蜘蛛特征請求,比較返回的 HTML 是否一致。
  3. 检查缓存規則里是否按 UA、Cookie、參數分桶,確認蜘蛛命中的是哪一版。
  4. 检查防護策略的白名單,確認主流搜尋蜘蛛的 IP 段和 UA 都被放行。
  5. 確認回源时狀態碼没有被改寫,404 就返回 404,301 就返回 301。

几個務實的處理方式

  • 内容更新後主動刷新相關 URL 的缓存,不要等 TTL 自然過期。
  • 给搜尋蜘蛛配置獨立的回源或缓存策略,保證它們拿到的是最新、完整的 HTML。
  • 在防護层放行驗證過的蜘蛛 IP 段,避免用驗證頁回應抓取請求。
  • 控制缓存键的维度,能不分 UA 就不分,减少同一 URL 的缓存副本數量。
  • 把响應時間当作抓取指标来监控,回源慢的問题尽早處理。
缓存层的作用是让訪問更快,不是改變蜘蛛能看到什么。把版本一致、狀態碼一致、放行規則這三件事確認好,蜘蛛那邊的抓取才不會莫名其妙地卡住。

蜘蛛並不需要特殊照顾,它需要的是稳定和一致:稳定指响應速度和可用性,一致指不同节点、不同時間返回的内容是同一份。把這两点做到位,抓取覆盖和發現效率的變化通常會自己顯現出来。