搜尋抓取

蜘蛛拿到的是源站還是缓存:CDN 层如何影响抓取结果

站点前面挂了 CDN 或反向代理时,蜘蛛抓到的可能不是源站的實时内容。本文梳理抓取請求经過的层級、舊版本 HTML 被缓存、错誤狀態碼被缓存、多节点内容不一致等常见問题,並给出缓存策略與抓取策略對齐的排查清單。

搜尋抓取

蜘蛛拿到的是源站還是缓存:CDN 层如何影响抓取结果

蜘蛛的請求,先到 CDN,再到源站

排查抓取問题时,很多人的第一反應是打開源站日誌。但如果站点前面挂了 CDN 或反向代理,蜘蛛的請求往往先落在邊缘节点上——命中缓存就直接返回,根本不會走到源站。這时候源站日誌里一片安静,很容易被誤判成蜘蛛没来,方向從一開始就偏了。

一次抓取請求會经過哪几层

  • DNS 解析:蜘蛛把域名解析到 CDN 提供的节点地址,而不是源站 IP。
  • 邊缘节点:判断该 URL 有没有可用的缓存副本,是否需要按 UA、Cookie 做区分。
  • 回源:缓存未命中或已過期时,节点才向源站發起請求。
  • 源站返回:源站的狀態碼和响應头會被节点记錄,其中一部分會被缓存下来。

也就是说,蜘蛛看到的頁面,有可能是几分钟前的,也可能是几天前的,取决于缓存策略怎么设。

缓存命中时,蜘蛛拿到的可能不是最新内容

舊版本 HTML 被缓存

HTML 文档如果被设了較長的缓存時間,頁面更新之後,蜘蛛在缓存有效期内訪問到的仍是舊版本。结果就是内容已经改了,抓取记錄里却看不出任何變化。

错誤狀態碼被缓存

更麻烦的是狀態碼。源站因為一次短暂故障返回 500 或 502,如果這類响應被节点缓存下来,蜘蛛在接下来一段時間里會反复拿到 5xx。反過来,頁面在被删期間返回 404 並被缓存,即使後来恢复上架,蜘蛛仍可能繼續拿到 404。這類問题在源站日誌里往往看不到痕迹。

多节点版本不一致

不同地区的节点回源時間不同,同一個 URL 在不同节点上的版本可能不一样。蜘蛛從不同出口 IP 抓取时,看到的结果就會出現差异,表現成时好时坏、飘忽不定。

几個可以自查的信号

  • 源站日誌里缺少某段時間的蜘蛛记錄,但 CDN 訪問日誌里有。
  • 頁面已经更新,蜘蛛抓取之後缓存里仍是老内容。
  • 同一個 URL 的狀態碼在 200、404、5xx 之間来回跳。
  • 不同地区抓取结果不一致,或者只有部分节点表現異常。
  • 蜘蛛 UA 被 WAF 或人机校驗拦下,返回的是驗證頁而不是正文。

把缓存策略和抓取策略對齐

  1. HTML 文档不要设過長的缓存時間,或改用协商缓存,让节点能及时向源站確認版本。
  2. 静態资源如 CSS、JS、图片可以長缓存並加上指纹,它們不參與 URL 發現。
  3. 源站返回 5xx 时,明确告诉 CDN 不要缓存這類响應。
  4. 希望蜘蛛看到與用戶一致的内容时,注意 Vary 头、UA 白名單和缓存键的设計。
  5. 更新 URL、robots.txt、Sitemap 之後,把刷新流程走一遍,不要只改源站。
  6. 把 CDN 訪問日誌和源站日誌按時間對齐来看,才能還原完整的抓取路径。

別让安全策略把蜘蛛当成攻击者

有些站点為了防采集,開了频率限制或 JS 挑战。處理不当會出現两種结果:一是蜘蛛直接拿到 403、429;二是返回 200,但正文是校驗脚本,蜘蛛拿到的是空壳。後者更难發現,因為狀態碼看上去完全正常,和软 404 的表現很像。

缓存层的目标是让訪問更快,不是让内容更难被發現。凡是會让蜘蛛拿到的版本與真實内容不一致的設定,都值得重新检查一遍。

做站点运营时,把抓取問题只当成源站問题,很容易漏掉中間那一层。养成同时看 CDN 日誌、源站日誌和缓存命中率的习惯,很多看似莫名其妙的現象,其實都能找到出處。