蜘蛛抓取站点时,請求通常不會直接打到源站,而是先落到 CDN 或反向代理的邊缘节点。這意味着蜘蛛拿到的 HTML,有可能是缓存副本,也可能是回源後的最新版本。两者不一致时,就會出現“自己打開是新的、蜘蛛抓到還是舊的”這類情况,URL 發現和内容判断都會跟着受影响。
抓取請求在鏈路里的位置
一次抓取大致经過:DNS 解析、邊缘节点接入、缓存查找、命中則直接返回、未命中則回源、源站生成 HTML、再按缓存策略寫回节点。蜘蛛只看到最後返回的那份内容,中間是命中還是回源、来自哪個节点,它都感知不到。
所以排查抓取問题时,先把“蜘蛛看到的是哪一版”確認清楚,往往比反复修改正文更有效。
缓存键决定了蜘蛛拿到哪一版
邊缘节点用缓存键判断两個請求算不算同一個頁面。缓存键通常包含 URL 路径和查询字符串,但有些配置還會把請求头纳入進来,比如 Accept-Encoding、User-Agent 或 Cookie。
- 按 UA 区分缓存:如果站点给蜘蛛和普通訪客返回不同内容,缓存键里最好带上對應标识,否則两邊會互相覆盖。
- Cookie 參與缓存:带會话 Cookie 的請求绕過缓存,回源生成的内容可能夹带個性化模块,蜘蛛抓到的版本和匿名訪客並不相同。
- 查询參數被忽略:忽略參數的配置會把带參數的地址和無參數地址归為一份缓存,蜘蛛遍歷參數變体时可能反复拿到同一份 HTML。
常见的不一致场景
- 發布新頁面後只刷新了首頁缓存,新連結所在的栏目頁仍是舊副本,蜘蛛顺着舊列表走,找不到新 URL。
- 缓存里存着舊的狀態碼,某個 URL 已经從 404 變成 200,邊缘仍在返回舊响應。
- 多节点部署、回源到不同後端,各邊缘节点上的版本不一致,蜘蛛不同轮次抓到不同结果。
- 移動版與桌面版共用缓存键,两邊 HTML 混在一起返回。
- Vary 头缺失,同一 URL 因 Accept-Encoding 不同而出現压缩與未压缩两份缓存。
排查顺序
- 用蜘蛛的 User-Agent 向目标 URL 發起請求,儲存返回的 HTML。
- 看响應头里的缓存标识字段,確認是命中還是回源,以及缓存寫入時間。
- 同一 URL 從不同網絡出口、不同节点各請求一次,比對内容是否一致。
- 若不一致,先检查缓存键配置、Vary 設定和回源規則,而不是先怀疑正文质量。
- 調整缓存策略後,再观察服務器日誌里蜘蛛的抓取時間與請求结果是否同步變化。
缓存問题往往表現為“抓取不稳定”:同一頁面时好时坏。先把内容版本固定住,再谈抓取频率和收錄,顺序才對。
發布與刷新的配合
新頁面或改版頁面發布时,比較稳妥的做法是:内容先上线,主動刷新相關 URL 的缓存(含列表頁和詳情頁),再提交 Sitemap 或补充站内入口連結。顺序反了,蜘蛛很可能在缓存還是舊版本时就来訪,抓到的列表里没有新連結。
對更新频繁的列表頁,可以設定較短的缓存時間;對變動少、体积大的静態资源,缓存時間可以長一些。關键是让蜘蛛在合理的抓取間隔内,能稳定讀到目前有效的版本。
最後一点:缓存配置本身不會让頁面被抓取,也不承诺带来排名,它的作用是保證蜘蛛每次来訪拿到的内容是一致的、可判断的。版本一致之後,URL 發現、抓取路径和後續的内容评估才有稳定的基础。