搜索抓取

Sitemap 的 lastmod 写错之后:蜘蛛的重访安排会怎么乱

Sitemap 的 lastmod 常被随手写成当前时间或全站统一值,结果让蜘蛛的重访节奏失真。本文梳理它真正影响什么、三种常见写错方式带来的连锁反应,以及用响应头核对、统一时区格式等可操作的修正步骤,帮你把这一个字段用回它本来的用途。

搜索抓取

Sitemap 的 lastmod 写错之后:蜘蛛的重访安排会怎么乱

Sitemap 里的 lastmod 是很多站长最熟悉、也最容易随手写错的一个字段。它本来只是告诉蜘蛛“这个 URL 大概什么时候更新过”,但因为它会参与蜘蛛判断“要不要来、什么时候来、来了之后值不值得再抓一次”,写错了,浪费的往往是本来就不宽裕的抓取安排。

lastmod 通常会影响什么

它不是排名因素,也不保证蜘蛛会按你写的日期上门。它的作用更像一份日程提示:在抓取资源有限的情况下,蜘蛛会参考历史抓取记录、页面变更情况和 lastmod 这类信号,去安排哪些 URL 值得优先重访。信号可靠,调度就可能更贴近你的更新节奏;信号混乱,调度就可能要么浪费在没变的页面上,要么迟迟不来。

它和条件请求是配套的

蜘蛛重访时如果带上 If-Modified-Since 一类的条件请求,服务器可以返回 304,省下一次传输。前提是服务器确实知道文件的最后修改时间。如果 Sitemap 写的是 A 时间、HTTP 头里给的是 B 时间,两边对不上,蜘蛛接收到的信号就是矛盾的。

三种常见的写错方式

  • 全站一个时间戳。几千个 URL 全部同一个 lastmod,等于在说“它们同时更新”。真实情况显然不是,久而久之这个字段就失去了参考价值。
  • 每次生成都刷成当前时间。程序每次跑 Sitemap 都写入 now(),页面内容其实没动。蜘蛛连续几次来都发现页面没变,只会逐渐降低对这个字段的信任。
  • 时区与格式混乱。有的写 2024/5/6,有的写 6 May 2024,有的用本地时间又不带偏移量,跨时区时可能凭空多出或少掉一天,比较难以对齐。

写错之后的连锁反应

最直接的影响是重访节奏被打乱。页面明明改了,蜘蛛按旧信号判断“最近没动”,来的次数就少;页面没改却天天被标记为更新,蜘蛛反复白跑,占掉的正是本该分给新页面和其他重要页面的抓取额度。

更隐蔽的问题出在内链与抓取路径上。如果新上线的栏目页 lastmod 长期停在过去,蜘蛛顺着内链走到这里,可能只做一次浅抓取;而如果 Sitemap 里的时间与页面实际内容长期不一致,蜘蛛在多个来源之间来回校验,也会带来不必要的请求。

把 lastmod 当成“内容真正发生变化的时间”,而不是“文件被写到磁盘的时间”,通常更接近它的用途。

怎么核对和修正

  1. 抽查一批 URL,用 curl -I 看响应头里的 Last-Modified,与 Sitemap 里写的时间做对比,看是否在合理范围内一致。
  2. 确认生成逻辑取的是内容库的更新时间字段,而不是每次构建的时间戳。
  3. 统一使用带时区的 ISO 8601 格式,例如 2024-05-06T09:30:00+08:00,减少解析歧义。
  4. 分片 Sitemap 时,让每个分片的 lastmod 反映该分片内最新的真实更新时间,不要统一覆盖。
  5. 改版、批量迁移之后,全站内容确实变了,这时写当前时间是合理的;迁移完成、内容稳定之后,就该回到真实更新时间。

和服务器稳定性一起看

lastmod 只是调度参考,能不能按这个节奏抓下来,还要看服务器是否稳定。响应时间波动大、偶尔出现 5xx,蜘蛛即使按计划来了,也可能中途降低频率。所以把 Sitemap、内链结构、服务器响应这几件事放在一起排查,通常比单独盯着某一个字段更有效。

简单说:lastmod 写对不会让你多收录什么,但写错确实可能让本该被及时看到的内容,多等上一阵。