给站点接入 CDN、開啟頁面缓存,通常是提速最直接的办法。但對搜尋蜘蛛来说,多一层缓存就多一层變量:同一個 URL,在不同時間、不同节点上,可能返回不一样的内容。运营要做的,是让缓存對用戶和蜘蛛保持一致。
缓存為什么會干扰抓取
蜘蛛看到的頁面,是缓存节点返回给它的那一版。如果這一版和用戶看到的不一致,問题就来了:正文缺一段、價格是舊的、列表頁少了几條,甚至缓存里存着已经下线的頁面,而訪問记錄上仍是一個正常的 200。
更麻烦的是,不一致往往不是全局的。邊缘节点各自為政时,蜘蛛這次抓到 A 版,下次抓到 B 版,站内就出現了同一地址多個版本的情况,canonical 判断和内容识別都會受影响。
常见的問题点
- HTML 被長時間缓存:把正文頁当静態资源缓存几天甚至更久,發布新内容後蜘蛛仍拿到舊版。
- 缓存刷新滞後:内容更新了,但没有主動刷新缓存,只能等自然過期。
- 按 UA 区分返回:给蜘蛛和给用戶返回不同版本,容易造成内容判断偏差。
- 回源失敗返回空壳:源站異常时,CDN 返回一個 200 的空頁面,蜘蛛會当成正常内容。
- 缓存带參數的 URL:把篩選、跟踪參數也缓存成獨立頁面,抓取面被放大。
- CDN 侧的安全規則:把某些 UA 或高频請求直接拦掉,返回 403,蜘蛛自然吃閉门羹。
- 多节点不一致:不同地区节点的缓存狀態不同,抓取结果會飘忽。
怎么看缓存狀態
多數 CDN 會在响應头里返回缓存狀態标记,比如命中、回源、已過期等。自查时把這些头和你請求的 URL 一起记下来,连續观察几天,就能看出哪些頁面長期命中舊版、哪些頁面根本没被缓存。這两個方向的處理方式不同:前者要缩短缓存時間或主動刷新,後者要检查缓存規則是否把某些路径排除掉了。
別忽略静態资源
图片、CSS、JS 這類文件缓存時間長一些通常没問题,但要注意文件名或版本号是否随内容變化。改了样式却沿用同一個文件地址,缓存里仍是舊文件,頁面呈現和蜘蛛讀到的结构就可能對不上。给静態资源加上版本标识,是成本很低的做法。
一次可执行的缓存自查
- 用搜尋蜘蛛的 UA 請求几個關键頁面,记錄返回内容和缓存狀態头。
- 再用普通浏览器請求同一地址,對比两次结果是否一致。
- 查看 HTML 响應的 Cache-Control 與 Expires,確認正文頁没有被设成長期强缓存。
- 發布新内容或修改舊内容後,立刻用蜘蛛 UA 再請求一次,看是否已经刷新。
- 換不同入口或节点請求同一地址,检查结果是否稳定。
- 確認 CDN 的安全與限速規則里,没有针對搜尋蜘蛛的拦截。
- 對照服務器日誌中的回源记錄,看蜘蛛請求是否真的打到了源站。
把刷新動作纳入發布流程
缓存問题很少是一次性修好的,它跟着發布节奏反复出現。比較省事的做法是在發布流程里固定一步:内容更新後主動刷新對應 URL 的缓存,栏目頁和首頁這類聚合頁也一起處理。這样比事後一個個排查要省力得多。
缓存的目标是让用戶更快看到正确内容,蜘蛛看到的也應该是同一版。任何“给蜘蛛單獨准备一份”的做法,都要先想清楚會不會带来新的不一致。
观察一段時間再調
改完策略後不必急着下结论。看几天的日誌,關注蜘蛛請求的狀態碼分布、回源比例以及抓取到的頁面版本是否稳定。如果發現同一地址仍有多版本返回,就回到上面的清單逐條核對。缓存策略與抓取表現的關系,通常需要一段時間的记錄才能看清。