很多站点在接入 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 在抓取里就變成了低價值目标。這類問题排查成本不低,但影响很直接。
怎么排查
- 在服務器和 CDN 两侧各看一遍日誌,重点比對蜘蛛 UA 的狀態碼、响應時間和回源比例。
- 用同一個 URL 分別以普通訪問和蜘蛛特征請求,比較返回的 HTML 是否一致。
- 检查缓存規則里是否按 UA、Cookie、參數分桶,確認蜘蛛命中的是哪一版。
- 检查防護策略的白名單,確認主流搜尋蜘蛛的 IP 段和 UA 都被放行。
- 確認回源时狀態碼没有被改寫,404 就返回 404,301 就返回 301。
几個務實的處理方式
- 内容更新後主動刷新相關 URL 的缓存,不要等 TTL 自然過期。
- 给搜尋蜘蛛配置獨立的回源或缓存策略,保證它們拿到的是最新、完整的 HTML。
- 在防護层放行驗證過的蜘蛛 IP 段,避免用驗證頁回應抓取請求。
- 控制缓存键的维度,能不分 UA 就不分,减少同一 URL 的缓存副本數量。
- 把响應時間当作抓取指标来监控,回源慢的問题尽早處理。
缓存层的作用是让訪問更快,不是改變蜘蛛能看到什么。把版本一致、狀態碼一致、放行規則這三件事確認好,蜘蛛那邊的抓取才不會莫名其妙地卡住。
蜘蛛並不需要特殊照顾,它需要的是稳定和一致:稳定指响應速度和可用性,一致指不同节点、不同時間返回的内容是同一份。把這两点做到位,抓取覆盖和發現效率的變化通常會自己顯現出来。