常见問题

蜘蛛池入口頁走了 CDN 缓存,搜尋蜘蛛拿到的是舊 HTML 會影响目标URL發現吗

入口頁接入 CDN 後,邊缘节点可能把舊版本 HTML 直接返回给搜尋蜘蛛,導致新增或修改過的連結迟迟不被發現。本文說明缓存命中、Vary 配置、爬虫 UA 被限流等常见成因,並给出用蜘蛛 UA 驗證、對比源站、調整 TTL 與缓存刷新規則的排查顺序。

常见問题

蜘蛛池入口頁走了 CDN 缓存,搜尋蜘蛛拿到的是舊 HTML 會影响目标URL發現吗

很多站長遇到過一個看着很矛盾的現象:源站入口頁里明明已经加上了新的目标 URL,用浏览器打開也能看到,但搜尋蜘蛛就是不跟進。查日誌會發現蜘蛛确實来過,只是抓到的 HTML 和現在源站的内容不一样。這種情况大概率不是蜘蛛的問题,而是 CDN 缓存层返回了舊版本頁面。

為什么 CDN 會让搜尋蜘蛛看到舊 HTML

CDN 的預設缓存键通常只有 URL,不看訪問者是谁。只要邊缘节点的缓存還没過期,請求就不會回源,节点上存的是什么,蜘蛛拿到的就是什么。源站更新連結之後,如果没触發刷新,蜘蛛在接下来的缓存周期里看到的仍然是舊頁面,新連結自然不會被發現。

几種比較常见的情形:

  • 入口頁属于“常驻缓存”,TTL 設定得很長,連結更新後没有主動刷新或预热。
  • 缓存規則里對爬虫 UA 做了單獨分流,部分节点返回源站内容,部分节点返回缓存内容,表現為抓取结果忽新忽舊。
  • 入口頁配置了 Vary: User-Agent 或 Vary: Cookie,搜尋蜘蛛拿到的可能是精简版、甚至不含連結的版本。
  • CDN 的 Bot 防護或频率限制把搜尋蜘蛛誤判為普通爬虫,返回驗證頁或 429,頁面里没有可解析的連結。

哪些情况影响最大

如果入口頁的角色就是“把連結暴露给蜘蛛”,那么缓存带来的偏差會被直接放大:源站更新得再勤,蜘蛛看到的始终是上一版。尤其是下面两類站点要特別注意。

  • 入口頁連結是程序按時間動態生成的,頁面内容變化频繁,但缓存 TTL 仍按静態资源設定。
  • 入口頁承担了反爬與限流职责,CDN 規則對非浏览器 UA 返回简化頁面,蜘蛛能進来但拿不到完整 HTML。

排查顺序

  1. 用搜尋蜘蛛的 UA 直接請求入口頁,观察响應头里的 X-Cache、Age、CF-Cache-Status 一類字段,判断這次是命中缓存還是回源。
  2. 把同一 URL 的源站直连结果與 CDN 返回结果做文本對比,看連結有没有缺失、是否被替換、HTML 是否被截断。
  3. 检查 CDN 的缓存規則與 UA 黑白名單:入口頁是否被長 TTL 缓存,搜尋蜘蛛是否被施加了 JS 挑战、驗證碼或限速。
  4. 翻 CDN 日誌里搜尋蜘蛛的請求记錄,重点看命中率、狀態碼分布,以及是否出現 403、429、503。
  5. 確認压缩與编碼正常,gzip、br 在邊缘节点上没有把 HTML 截断。

調整思路

  • 入口頁連結發生增删後,主動調用 CDN 的刷新或预热接口,不要等 TTL 自然過期。
  • 入口頁 TTL 设短一些,几分钟到一小时即可;它本身不是内容頁,没必要長時間缓存。
  • 對已確認的搜尋蜘蛛 UA 關閉 JS 挑战與频率限制,避免它們拿到不含連結的頁面。
  • 入口頁尽量不做 Vary: User-Agent 或按 Cookie 分流,保持同一 URL 對所有訪問者返回同一份 HTML。
  • 同时把入口頁放進 sitemap,给連結發現留一條不依赖缓存的路径。
缓存問题最典型的表現是“部分节点能抓到新連結、部分节点還是舊的”。如果只看單次抓取结果,很容易誤判成蜘蛛不跟進或目标站有問题。

需要說明的是,修好缓存一致性只是让入口頁的連結能被稳定看到,並不等于目标 URL 一定會被收錄。抓取和收錄由搜尋引擎自行决定,這里能做的只是把發現环节的障碍清掉,剩下的交给正常的抓取节奏去驗證。