搜索抓取

lastmod 与重访优先级:怎么让蜘蛛相信页面真的更新了

Sitemap 里的 lastmod 常被当成必填字段,构建时全量刷新,结果整站看起来天天更新,信号逐渐失去区分度。本文拆解 lastmod 在抓取决策中的实际作用,列出几种常见写法问题,说明哪些内容变化值得更新时间戳,并给出 Last-Modified、内链位置、内容指纹等配套做法和一次日志抽样的自查方法。

搜索抓取

lastmod 与重访优先级:怎么让蜘蛛相信页面真的更新了

Sitemap 里的 lastmod 经常被当成一个“填了就行”的字段:不少站点每次构建都把全部 URL 的时间刷新成当天,结果是蜘蛛看到整站天天更新,久而久之把这个信号当作噪音处理。这篇想说的是,lastmod 更接近一条线索,而不是一条命令,它的价值取决于它与页面真实变化之间是否一致。

蜘蛛为什么在意更新时间

站点的 URL 总量通常远大于蜘蛛在单位时间内能抓取的数量,所以抓取队列里必然要做取舍:新 URL 要抓,旧 URL 也要重访。当蜘蛛没法从页面本身低成本判断“有没有变”时,就会参考若干外部提示,lastmod 是其中之一。它不会单独决定抓取顺序,但会作为一个维度参与权衡。

这也解释了一个现象:lastmod 写得越随意,它带来的边际收益越小。当大部分 URL 的时间戳频繁变动、而页面内容几乎不变时,这个字段就失去了区分度。

几种常见的写法问题

  • 全量刷新:构建脚本把 sitemap 中所有条目的 lastmod 统一改成构建时间,与页面内容是否变化无关。
  • 格式不一致:有的条目带时区,有的不带;有的精确到秒,有的只到日期。格式混乱会让解析结果不可靠。
  • 时间来自模板:列表页、聚合页的 lastmod 跟着模板走,正文没有任何改动也跟着变。
  • 只在新发时写一次:正文做过实质性修订,价格或库存也变了,时间却停留在首次发布那天。

哪些变化值得改 lastmod

判断标准可以简单一点:这个改动对访问者看到的内容有没有影响。

  1. 正文的新增、删减、纠错,属于值得更新的改动。
  2. 结构化数据里价格、库存、状态的变动,通常是高频且真实的更新。
  3. 页面主要模块的位置调整、信息合并,也可以更新。
  4. 纯粹的样式微调、缓存刷新、页脚年份改动,一般没必要动 lastmod。
如果拿不准,就问自己一句:一个上周来过这个页面的用户,今天再来会不会看到实质不同?答案是否,就不要改时间。

lastmod 之外的配套信号

单一字段容易被忽略,配合其他信号会更稳。

  • Last-Modified 响应头:与 sitemap 中的时间大致对齐,两者能相互印证。
  • 内链位置变化:把更新过的页面挪到首页或栏目页更靠前的位置,蜘蛛重访这些高频页面时更容易再次碰到它。
  • Sitemap 分片:只重写发生变化的那个分片和对应索引文件,降低蜘蛛的对比成本。
  • 内容指纹:记录正文哈希,只有哈希变化时才更新 lastmod,减少人工遗漏。

一次简单的自查

不需要复杂工具,做一次抽样对比就能看出问题:从服务器日志里挑几十个 URL,把每个 URL 最近一次被抓取的时间,和它在 sitemap 里的 lastmod 放在一起看。如果大量 URL 的 lastmod 长期等于构建时间,而页面内容并无变化,说明这个字段正在被滥用;如果明明修订过的页面 lastmod 还停在首次发布,说明更新链路存在漏点。

把更新当成流程,而不是字段

真正影响重访效率的,往往不是 lastmod 的写法本身,而是站点有没有一条“内容更新—时间戳更新—内链位置更新”的完整链路。字段只是这条链路的末端输出。把它当成一个需要维护的流程,比把它当成一个必须填满的字段,更接近问题的本质。