常见問题

入口頁被 CDN 缓存了舊版本,搜尋蜘蛛抓到的連結是哪一份

入口頁更新了連結,搜尋蜘蛛抓到的却還是舊版本,通常不是抓取环节出了問题,而是 CDN 或頁面缓存返回了舊 HTML。本文說明蜘蛛實际看到的究竟是哪一份内容、缓存如何影响新連結的發現、怎样用响應头和無缓存請求来確認,以及刷新缓存與設定 TTL 的實用做法。

常见問题

入口頁被 CDN 缓存了舊版本,搜尋蜘蛛抓到的連結是哪一份

做蜘蛛池的人经常會遇到這種情形:入口頁明明已经換了新一批目标 URL,可日誌里搜尋蜘蛛抓的還是上一批;自己用浏览器打開入口頁,看到的也是舊連結。多數时候不是蜘蛛不認新内容,而是它拿到的 HTML 本身就是舊的那一份,缓存层把更新挡在了外面。

搜尋蜘蛛看到的是哪一份内容

搜尋蜘蛛發出的是普通 HTTP 請求,它拿不到所谓的最新版本,只能拿到請求那一刻服務器返回的 HTML。中間只要隔着 CDN、反向代理、頁面缓存插件或者對象存储的静態快照,返回的就是缓存节点上的那一份。因此,入口頁里的連結能不能被發現,前提是這份缓存副本里确實含有那些連結。

入口頁更新的時間点,不等于搜尋蜘蛛看到新連結的時間点。两者之間隔着缓存過期的時間窗口。

缓存會怎样影响 URL 發現

  • 新連結延迟出現:缓存未過期前,新加的目标 URL 不會出現在蜘蛛拿到的 HTML 里,自然不會被顺着抓走。
  • 舊連結持續被抓:已经下线的連結如果還留在缓存副本里,蜘蛛會繼續按舊版本訪問,日誌中就會出現一批本该消失的 URL。
  • 不同节点结果不一致:多地 CDN 节点回源节奏不同,可能出現部分节点已更新、部分還是舊版,抓取表現看起来时好时坏。

怎么確認是缓存導致的

  1. 用带随机查询串或明确禁止缓存的請求訪問入口頁,把返回的 HTML 與蜘蛛日誌里的連結做個對比。
  2. 查看响應头里的 Age、X-Cache、CF-Cache-Status 一類字段,判断命中的是缓存還是回源。
  3. 從不同地区或不同线路請求同一個入口頁,看返回内容是否一致。
  4. 把改動前後的 HTML 快照儲存下来逐條對比,比凭印象判断可靠得多。

處理建议

更新入口頁後,第一件事是主動刷新缓存,而不是干等它自然過期。CDN 一般提供刷新或清理接口,把入口頁的真實 URL 提交一遍,多數情况下几分钟内就能让新版本生效。

入口頁的缓存时長要跟更新频率匹配。更新频繁的入口頁用較短的 TTL 更合适;長期不動的入口頁可以放長一些,减少回源压力。如果入口頁是程序動態生成,注意別把整頁设成長期缓存,否則每次換連結都得人工清理。

另外,入口頁的連結列表最好带上可對帳的标记,比如按上下线時間排序。這样当發現蜘蛛抓的和目前列表對不上时,能較快判断是缓存停留在舊版本,而不是連結本身寫错或拼错。

不建议的做法

  • 為了绕開缓存而频繁更換入口頁 URL。舊入口頁仍會留在蜘蛛的抓取队列里,等于多出一批無意义的抓取。
  • 對入口頁直接關閉所有缓存。回源压力上去後,抓取高峰时更容易超时,對蜘蛛並不友好。
  • 只刷新首頁,忘了入口頁所在的具体路径。刷新要精确到實际被抓的那個 URL。

缓存本身不是問题,問题在于更新和缓存過期之間的時間差没有被意识到、也没有被管理。把缓存刷新纳入入口頁更新的常規流程,並让 TTL 與更新节奏對齐,大多數所谓“蜘蛛不来抓新連結”的情况都會明顯减少。