很多站点在源站前面挂了 CDN 或反向代理,蜘蛛發起的請求,未必每次都落到源站。它拿到的可能是缓存里的副本、可能是回源後的最新内容,也可能是一個被缓存下来的错誤頁。對搜尋蜘蛛来说,它只按响應结果處理頁面;對运营来说,需要知道蜘蛛到底看到了什么。
缓存命中时,蜘蛛讀到的是哪一份
CDN 的工作方式不复杂:先看本地有没有可用的缓存副本,命中就直接返回,未命中或過期就回源取一次,再按規則决定要不要缓存。問题在于,蜘蛛的抓取节奏和你的發布节奏、缓存過期节奏往往不同步。頁面已经更新,但 CDN 上還是舊副本;或者缓存刚好過期,蜘蛛回源时又碰上源站响應慢。
這些情况不一定會让抓取失敗,但會影响蜘蛛對頁面的判断:标题、正文、内鏈、甚至狀態碼,都可能是缓存层给出的。
抓取路径上常见的几類缓存問题
- 内容更新延迟:源站已發布新版本,CDN 仍按 TTL 返回舊頁面,蜘蛛短期内讀到的是舊内容。
- 错誤頁被缓存:源站短暂 5xx 或超时,CDN 把错誤响應缓存下来,蜘蛛反复拿到同一個失敗结果。
- URL 變体各自缓存:带跟踪參數、大小寫或斜杠不同的地址各存一份,蜘蛛可能把同一内容当成多個頁面。
- 個性化内容混入:缓存了带登入態、地区信息或推荐模块的 HTML,蜘蛛看到的版本與普通訪客不一致。
- 静態资源與 HTML 策略混淆:图片、CSS 可以長缓存,HTML 若也设很長的 TTL,更新就很难及时被蜘蛛感知。
让缓存层和抓取节奏對齐
- 区分资源類型設定缓存策略。静態资源可以長缓存並加指纹;HTML 通常需要更短的 TTL,或使用可协商的缓存方式。
- 把清缓存纳入發布流程。發布完成後主動刷新相關 URL 的缓存,而不是等 TTL 自然過期。
- 確認错誤狀態不會被長期缓存。检查 CDN 對 4xx、5xx 的缓存規則,避免蜘蛛被缓存下来的失敗响應挡住。
- 检查回源請求头。源站可以根據 User-Agent 或来源标识识別蜘蛛,但不要在缓存层做過于個性化的輸出,否則蜘蛛和用戶看到的不一致。
- robots.txt 和 X-Robots-Tag 別只放在源站。如果缓存层返回了舊头部,蜘蛛可能按舊規則處理整個目錄。
缓存之外,服務器稳定性仍是底座
缓存命中率高时,源站压力小,蜘蛛抓取更顺;但缓存一旦集中過期,回源請求會短时叠加。如果源站没有余量,超时和 5xx 就會出現,蜘蛛可能降低抓取频率。對抓取路径来说,稳定的响應比短暂的极速更重要。必要时可以预热關键頁面,或把 TTL 打散,避免同一時間大批 URL 一起回源。
用响應头和日誌做一次自查
- 用带蜘蛛 User-Agent 的請求訪問几個重要 URL,观察 Age、Cache-Control、X-Cache 等响應头,判断是命中還是回源。
- 對比同一 URL 在源站和 CDN 节点返回的正文,確認是否一致。
- 把 CDN 回源日誌與蜘蛛抓取日誌按時間對照,看抓取高峰是否经常撞上回源高峰。
蜘蛛看到的頁面,取决于你的缓存策略。把缓存层当成抓取路径的一部分来管理,比事後猜测為什么蜘蛛没更新更有效。