蜘蛛池入口頁通常不是给用戶看的,而是给搜尋引擎蜘蛛提供連結路径。很多站点會把入口頁放到 CDN 或反向代理後面,這时缓存就會介入蜘蛛的每一次請求。蜘蛛拿到的可能不是源站最新内容,而是邊缘节点上的舊副本。如果入口頁的連結已经更新,但缓存没刷新,蜘蛛就會反复看到同一批舊連結,URL 發現效率自然下降。
缓存為什么會改變蜘蛛看到的内容
蜘蛛請求入口頁时,會先经過 DNS、CDN、反向代理,最後才到源站。如果 CDN 节点上有未過期的缓存,請求不會回源,蜘蛛得到的是缓存副本。對蜘蛛来说,它並不知道這是缓存,只會按拿到的 HTML 解析連結。常见問题包括:新加的連結没出現,删掉的連結還在,不同节点返回不同版本。
缓存並不只發生在 CDN。Nginx、Varnish、對象存储、甚至某些主机面板的静態缓存,都會让入口頁在一段時間内保持舊狀態。排查时要先確認蜘蛛請求到底经過了哪一层。
常见缓存头與蜘蛛抓取的關系
Cache-Control
max-age 决定缓存副本在浏览器和中間层保留多久。s-maxage 主要面向 CDN 等共享缓存。入口頁如果更新频繁,max-age 可以设短一些,比如几十秒到几分钟;如果入口頁長期不變,可以适当放長,但更新連結後要主動刷新。還要注意 no-cache 不是不缓存,而是每次使用前要回源校驗;no-store 才更接近完全不儲存。
ETag 與 Last-Modified
這两個头用于條件請求。蜘蛛再次訪問时,如果带上 If-None-Match 或 If-Modified-Since,源站可能返回 304,表示内容没變。這能减少传輸,但如果入口頁内容變了而 Last-Modified 没更新,蜘蛛可能誤以為没變化。動態入口頁要确保修改連結後,响應头里的校驗标识也随之變化。
Vary
如果對蜘蛛和普通用戶返回不同内容,又設定了 Vary: User-Agent,CDN 可能會按 UA 分別缓存。表面看没問题,實际上容易造成缓存碎片:蜘蛛拿到的是某個版本的缓存,普通用戶拿到另一個版本。蜘蛛池入口頁通常没必要针對蜘蛛做單獨模板,保持同一份 HTML 更稳妥。
CDN 缓存带来的几個實际問题
- 邊缘节点不同步:蜘蛛從不同地区节点抓取,可能看到不同版本的入口頁,連結數量不一致。
- 舊連結長期不消失:源站已经刪除的連結,因缓存未過期仍被蜘蛛抓到,形成無效請求。
- 回源比例過高:把缓存時間设得太短,蜘蛛每次訪問都回源,服務器压力反而更大。
- 刷新不及时:更新入口頁後只刷新首頁,没有刷新具体 URL,蜘蛛仍命中舊缓存。
動態入口頁與缓存的冲突
如果入口頁的連結是程序動態生成的,缓存設定要更谨慎。完全静態化的入口頁适合較長缓存,但每次更新連結都要刷新 CDN;動態頁面适合短缓存或不缓存,让蜘蛛每次拿到較新的連結列表。折中做法是:入口頁框架可以缓存,連結列表部分通過短缓存或异步方式更新。
缓存只能减少蜘蛛等待和重复传輸,不能替代連結质量、内容相關性和站点可訪問性。把缓存当成收錄捷径,通常會失望。
排查缓存問题的基本步骤
- 用 curl -I 或浏览器開發者工具查看响應头,重点關注 Age、X-Cache、Via、Cache-Control。
- 對比源站直接訪問和通過 CDN 訪問的 HTML,看連結是否一致。
- 检查訪問日誌中同一入口頁的返回大小和狀態碼,判断是否長期命中缓存。
- 更新連結後,刷新對應 URL 的 CDN 缓存,並確認回源已经拿到新版本。
- 观察一段時間内蜘蛛對入口頁的抓取频率和發現的新 URL 數量,再决定缓存时長。
使用建议
- 入口頁缓存時間從短開始,確認蜘蛛能稳定拿到新連結後再逐步調整。
- 不要對蜘蛛單獨設定一套缓存策略,避免不同 UA 看到不同連結。
- 更新频繁的入口頁,建议配合 CDN 刷新接口或版本号參數,减少舊副本影响。
- 把缓存命中率、回源率和蜘蛛抓取日誌放在一起看,單獨看一項容易誤判。
蜘蛛池入口頁的缓存策略没有统一答案。更新越频繁,缓存越要短;更新越少,越可以放長。關键是让蜘蛛每次訪問都能拿到目前有效的連結列表,同时不给服務器增加無谓回源。先观察日誌,再調缓存,比一次性照搬模板更實用。