搜尋抓取

缓存與 CDN 回源:蜘蛛抓到的頁面是哪一层给的

站点接入 CDN 或反向代理後,蜘蛛請求的鏈路多了一层:缓存命中、回源压力、邊缘拦截與缓存過期,都會影响抓取速度和内容新鲜度。本文梳理這一层常见的响應差异,並给出一條從日誌到响應头的自查路径。

搜尋抓取

缓存與 CDN 回源:蜘蛛抓到的頁面是哪一层给的

站点接入 CDN 或反向代理之後,蜘蛛的請求鏈路就多了一层。它拿到的可能是一份缓存的 HTML,也可能是回源後實时生成的頁面,两者在首字节時間、狀態碼和内容新鲜度上都可能不同。抓取量下滑或頁面迟迟不被更新时,先分清頁面是哪一层给出的,通常比反复調整内鏈更快找到原因。

缓存命中與未命中,蜘蛛看到的是两種响應

同一個 URL,缓存命中时可能几十毫秒返回;未命中时要等源站生成、查询資料库、拼接模板,几百毫秒甚至几秒。對蜘蛛来说,這两種响應的意义完全不同:前者能被快速消費,後者會占用抓取队列里的等待時間。抓取調度會參考歷史响應速度,長期偏慢的路径,回訪频率容易往下走。

所以缓存命中率低的頁面,即使内容质量不错,也可能在抓取节奏上吃亏。文章詳情頁、栏目列表頁是重点;带登入態、带随机參數的 URL 不适合缓存,也没必要强求。

回源压力决定了蜘蛛能走多快

缓存失效的瞬間,多個請求可能同时回源。如果源站没有做並發限制或請求合並,就會出現資料库连接被占满、响應時間拉長,甚至 5xx。這时候蜘蛛看到的是服務器不稳,通常會降低抓取速率,把队列往後排。

  • 给回源設定合理的並發上限,避免缓存同时失效造成尖峰;
  • 對同一 URL 的並發回源做合並,减少重复生成;
  • 错開缓存過期時間,避免整站同一时刻回源。

別在 CDN 或 WAF 层把蜘蛛挡掉

有些站点為了防爬,在邊缘节点配置了 UA 規則、频率限制或人机驗證。這些規則如果寫得粗糙,正常的搜尋引擎蜘蛛可能拿到 403、429,或者被跳轉到驗證碼頁面。日誌里看到大量非 200 的狀態碼,又找不到源站異常,就要往這一层查。

核對方式比較直接:用官方给出的驗證方法確認来訪者身份,再检查邊缘規則里是否有针對该 UA 的拦截或限速;同时確認返回的是真實内容,而不是一段包装過的挑战頁面。

缓存副本過期,蜘蛛可能長期抓到舊版本

頁面更新後,如果邊缘节点仍按舊 TTL 返回缓存内容,蜘蛛多次来訪看到的都是同一份 HTML,自然不會認為有更新。更麻烦的是 Sitemap 里的 lastmod 寫着新時間,實际返回的却是舊内容,两邊對不上。

常见做法是内容更新後主動刷新對應 URL 的缓存,或者對更新频繁的栏目使用較短的 TTL,同时保證 Sitemap 的 lastmod 與實际内容變更一致。

预渲染與動態渲染缓存的邊界

部分站点用预渲染或動態渲染服務,给蜘蛛返回一份渲染好的 HTML。這類缓存如果更新不及时,蜘蛛拿到的同样是舊版本;如果只對特定 UA 返回渲染结果,還要確認普通用戶看到的内容與蜘蛛版本没有實质差异,避免同一 URL 出現两套内容。

一條自查路径

  1. 在日誌里按响應碼和缓存狀態分组,看蜘蛛請求中命中與回源的比例;
  2. 用相同 UA 請求几個關键 URL,观察首字节時間和响應头里的缓存信息;
  3. 检查邊缘規則、限速策略里是否有针對蜘蛛的拦截;
  4. 確認更新後的頁面是否立刻返回新内容,lastmod 是否同步;
  5. 回源出現 5xx 时,先看源站並發和資料库,再看網絡层。
蜘蛛没有绕過缓存层的能力,它看到的就是邊缘节点返回的那一份响應。把這一层的响應時間、狀態碼和内容新鲜度理顺,抓取路径上的很多問题會自己變得清楚。