搜尋抓取

抓取請求经過 CDN 时,蜘蛛拿到的頁面来自哪一层

站点挂了 CDN 之後,蜘蛛的請求很可能在邊缘节点就被應答,源站日誌里看到的抓取未必是它實际拿到的内容。本文梳理缓存命中與回源之間的差异、三類常见的内容不一致、缓存键里容易被忽略的變量,以及一套可以照着走的排查顺序和調整方向。

搜尋抓取

抓取請求经過 CDN 时,蜘蛛拿到的頁面来自哪一层

很多人排查抓取問题时會直接翻源站日誌。但如果站点挂了 CDN,蜘蛛的請求很可能压根没到源站——它在邊缘节点就被應答了。這时候你看到的「抓取正常」,和蜘蛛實际拿到的内容,可能不是同一份。

蜘蛛拿到的往往是邊缘节点的那一份

CDN 的預設逻辑是:命中缓存就直接返回,未命中才回源。蜘蛛的請求通常比真實用戶更集中,如果缓存 TTL 較短,或者缓存键里带了 UA、Cookie 之類的變量,蜘蛛很容易每次都触發回源,也可能每次都落到不同节点上的不同副本。

判断方法很直接:用與蜘蛛一致的 UA 發一次請求,看响應头里的缓存标识字段——x-cache、age、cf-cache-status 這類,不同服務商命名不一样。命中與未命中,返回的 HTML 可能差很多。

三類常见的内容不一致

  • 版本滞後:源站已经更新,邊缘节点還留着舊副本,蜘蛛抓到的是過期頁面,頁面上指向新栏目的連結自然也不存在。
  • 节点差异:不同机房回源時間不同、预热程度不同,蜘蛛從不同出口訪問,可能落到新舊两套模板上。
  • 降級响應:回源超时或负载過高时,部分配置會返回简化頁、驗證頁甚至 5xx,蜘蛛拿到的就是一份没有出鏈的空壳。

缓存键里那些容易被忽略的變量

缓存键决定了「哪些請求算同一份」。常见的坑有两個:一是 Vary 头里带了 User-Agent,導致蜘蛛 UA 和普通浏览器 UA 各存一份,缓存命中率被拉低;二是 URL 上带追踪參數,同一篇文章被拆成几十個缓存條目,每個都要回源一次。

這两個問题叠加起来,结果通常是:缓存命中率不高,回源量被放大,源站响應變慢,蜘蛛的抓取节奏随之收紧,覆盖增長也就停了。

排查时可以按這個顺序走

  1. 拿蜘蛛 UA 請求几個代表性 URL,记錄响應头里的缓存狀態和 age 值。
  2. 同一 URL 從不同地区、不同出口多請求几次,對比返回内容是否一致。
  3. 绕過 CDN 直连源站,對比同一 URL 的 HTML 差异。
  4. 查 CDN 日誌中的回源率、5xx 比例,以及回源超时的阈值設定。
  5. 核對缓存键配置,確認 UA、Cookie、查询參數是否被無意纳入。

几條可以落地的調整

  • 让爬虫 UA 走一條獨立的缓存策略,或统一使用浏览器缓存副本,减少同一 URL 的多份存储。
  • 頁面更新後主動刷新對應 URL 的缓存,而不是等 TTL 自然過期。
  • 為回源超时設定合理的兜底:宁可返回上一次的完整副本,也不要返回断鏈的空頁。
  • 把分頁、篩選參數在 CDN 层做規范化,避免同一内容产生大量缓存條目。
蜘蛛看到的不是你的源站,而是它那一次請求實际命中的那一层。排查抓取問题时,先把這一层對齐,再谈後續的路径和覆盖。