入口頁更新了,蜘蛛日誌里還是舊連結
不少人做蜘蛛池时,會把入口頁当成一個随时可以改動的連結中轉頁。但改完之後發現:搜尋蜘蛛的抓取日誌里,請求的還是那批老目标 URL,响應体大小也没什么變化,好像蜘蛛根本看不到新版頁面。這類情况多數和缓存层有關,而不是蜘蛛不来抓。
缓存為什么會卡住入口頁的更新
入口頁通常是纯静態或准静態的 HTML,很容易被中間的缓存层接管:CDN 邊缘节点、反向代理、對象存储的静態化規則,以及服務器上的頁面缓存插件,都可能在第一次請求後把 HTML 存起来,後續直接返回。
缓存是否命中,取决于缓存键。常见的组合是 URL + Host,有些配置還會把 User-Agent、Cookie、Query 一起算進去。一旦缓存键里带了 User-Agent,就意味着给普通浏览器 UA 的缓存,和给搜尋蜘蛛 UA 的缓存是两份。你清了普通用戶看到的那一份,蜘蛛那份可能還留在邊缘节点上。
几個容易被忽略的缓存细节
- CDN 的 purge 如果只按 URL 提交,可能没有覆盖按 UA 分出的變体缓存。
- 服務商提供的爬虫加速或回源優化,本质是让蜘蛛更早命中缓存,反而可能延長舊版本的生命周期。
- 頁面里用時間戳或随机注释来判断新舊版本,但那是渲染时生成的,静態缓存的 HTML 里根本没有。
- 入口頁被伪静態規則当成文件處理並加了長缓存头,更新时只改資料库、没動文件。
怎么判断蜘蛛拿到的是不是舊内容
先把猜测換成對比。可以按下面的顺序排查:
- 用搜尋蜘蛛的 UA 請求入口頁,记錄响應头里的 Age、X-Cache、ETag、Last-Modified 等字段。
- 用普通浏览器 UA 請求同一個 URL,把两次返回的正文、連結列表、响應体大小做對比。
- 翻抓取日誌,看响應体大小是否長期是同一個固定值;如果连續多天完全一致,可能不是稳定,而是缓存没更新。
- 在頁面源碼里加一段固定的版本标记,例如注释里的版本号,用蜘蛛 UA 抓一次,看取到的是哪個版本。
如果蜘蛛 UA 拿到舊版本、普通 UA 拿到新版本,基本可以確認是按 UA 分片的缓存造成的問题。
處理顺序與取舍
處理缓存問题时,建议按下面的顺序来,不要一上来就把整站设成不缓存。
- 先全量清理:確認清理范围包含按 UA、按 Query 分出的變体,而不是只清主 URL。
- 再調整入口頁的缓存策略:入口頁属于经常變動的頁型,可以给一個較短的 TTL,或者使用能回源校對的缓存策略,而不是和图片、CSS 一样缓存几個月。
- 检查 Vary 設定:如果业務上不需要按 UA 区分内容,尽量不要让 Vary 把蜘蛛 UA 單獨分成一份缓存。
- 清理後再次驗證:用蜘蛛 UA 重新請求,確認版本标记已经更新,再观察後續的抓取日誌。
清完缓存之後會發生什么
清理缓存解决的是蜘蛛能看到哪一版頁面的問题,不解决蜘蛛什么时候来看、看了會不會抓目标 URL。搜尋蜘蛛的回訪間隔由搜尋引擎自己决定,没有可以保證的時間表。已经進入待抓队列的舊連結,也可能仍被抓取一次或多次;把連結從入口頁移除,只是让它不再從這條路径被持續發現。
把缓存理解成影响蜘蛛讀到哪一版頁面的因素,比理解成影响收錄的開關更准确。改動之後仍需持續观察日誌,而不是指望立刻生效。
小结
入口頁更新不生效,先查缓存,再看抓取日誌。對比蜘蛛 UA 與普通 UA 的返回结果,是最直接的一步;確認問题後再决定缓存 TTL、Vary 和清理范围。做到這一层,至少能保證蜘蛛看到的入口頁,和你以為的一致。