Sitemap 里的 lastmod 字段经常被当成一個開關:更新它,蜘蛛就该来重抓。實际執行时它更像一條线索,蜘蛛會把它和自己观察到的情况對照,再决定這個 URL 是否值得占用一次抓取配額。
蜘蛛判断“要不要再抓”时會看什么
對已经抓取過的 URL,蜘蛛通常不會只依赖一個字段,而是把多方面的信号放在一起權衡:
- 歷史變化频率:這個 URL 過去改動是否频繁,改完之後内容是否真的不同;
- 上次抓到的内容:和這次能拿到的版本比對,確認有没有實质變化;
- 站点层面的信号:内鏈、導航结构是否仍指向它,頁面是否還在有效路径上;
- Sitemap 声明:lastmod 是否被频繁重置,是否與頁面真實更新時間一致;
- HTTP 缓存头:Last-Modified、ETag 能否支撑一次條件請求;
- 服務器表現:响應時間、错誤率、是否经常超时。
這些信号里,Sitemap 属于“發現层”,HTTP 头属于“驗證层”。两层都做對,重抓請求才更容易落在真正變化的頁面上。
lastmod 被忽略的常见原因
lastmod 不是填上就有效,下面几種情况會让它逐渐失去參考價值:
- 每次部署都刷新全站時間,蜘蛛看到大量 URL 同时“刚刚更新”,但内容並没有變;
- 時間格式不規范,缺少时区或使用本地化寫法,解析後得不到可用信息;
- 把 lastmod 寫成未来時間,或者與頁面上的更新時間互相矛盾;
- Sitemap 中列了大量不重要的 URL,把真正需要重抓的頁面稀释掉。
让重抓更有可预期性的做法
這里说的“可预期”不是让蜘蛛按你的時間表来,而是减少它判断时的噪音。
Sitemap 侧
- 只在内容确實改變时更新 lastmod,格式使用带时区的 ISO 8601;
- 把更新频繁的栏目或资讯類頁面單獨分片,不要和長期不變的說明頁混在一起;
- 定期清理已经 404、301 到別處或已下线的 URL。
頁面與服務器侧
- 让 Last-Modified 反映真實的内容變更,而不是每次渲染都變;
- 稳定輸出 ETag,使條件請求能返回 304,避免重复传完整頁面;
- 保證抓取高峰时服務器不出現大量 5xx,错誤率升高會让整体抓取节奏放缓;
- 用内鏈把重要頁面放在網站结构里,而不是只靠 Sitemap 推送。
观察與驗證
改完之後不要只看一次日誌。可以關注:同一批 URL 的重抓間隔是否趋于稳定;抓取失敗的 URL 是否集中在某類模板;返回 304 的比例是否上升。這些指标比只盯着 Sitemap 更接近真實情况。
lastmod 是给蜘蛛的一條线索,不是抓取承诺。它起作用的前提是:頁面的真實變化和它声明的是同一件事。
把 Sitemap 当成一份“目前有效 URL 與更新情况”的清單,而不是一份想让蜘蛛按排期訪問的時間表,再配合稳定的服務器和清晰的内鏈结构,URL 的重新抓取才會慢慢形成可预期的节奏。