搜尋抓取

Sitemap 的 lastmod 该寫多准:時間戳與蜘蛛再抓取的關系

lastmod 是 Sitemap 里最容易被随手填寫的字段,却直接關系到蜘蛛是否值得重新抓取。本文說明時間戳寫错會带来哪些後果、如何從内容表與發布流程里生成相對可信的 lastmod,以及它與缓存头、内容實际變化之間的關系,並给出一個可执行的维護做法。

搜尋抓取

Sitemap 的 lastmod 该寫多准:時間戳與蜘蛛再抓取的關系

在 Sitemap 的字段里,lastmod 大概是最容易被随手填寫的一個。很多站点要么全部用构建時間,要么干脆不寫。它本身不會让頁面被收錄,但會影响蜘蛛判断“這個 URL 是否值得再来一次”的優先級,所以值得認真對待。

lastmod 在抓取調度里的位置

蜘蛛安排下一次抓取时,通常會參考几個信号:頁面上次被抓取的時間、内容是否發生變化、站点整体的更新节奏,以及 Sitemap 中声明的 lastmod。前几項来自蜘蛛自己的观察,最後一項来自站点自己的声明。

当声明與观察長期一致时,這個信号會被更信任;当声明经常和實际情况對不上,它就會逐渐被忽略。這也是“全部填今天”這種做法往往不如不填的原因。

三類常见的 lastmod 错誤

  • 全站统一時間:每次生成 Sitemap 都把当天日期寫给所有 URL。蜘蛛抓回来發現内容與上次一样,声明就失去了參考價值。
  • 時間倒流或超前:修改内容後忘了更新,或者用了未来的時間戳。前者让新内容被当成舊内容,後者通常直接被忽略。
  • 粒度太粗:只精确到天,或者每次构建都刷新一遍。對更新不频繁的栏目頁影响不大,但對新闻、商品、库存類頁面,粗粒度會把“刚改過”的信号淹没掉。

怎么生成一份相對可信的 lastmod

  1. 让 lastmod 跟随内容本身的變化,而不是构建動作。可以在内容表里保留 updated_at 字段,編輯儲存时更新,构建时讀取。
  2. 只有正文、價格、库存這類實质字段變化时才更新;導航、頁脚模板調整不應触發全站時間戳變化。
  3. 统一时区與格式,使用带时区的 ISO 8601 寫法,避免服務器时区和蜘蛛理解不一致。
  4. 不要人工填寫。人工维護的字段在几百個 URL 之後基本必然失控。
把 lastmod 当成内容變更日誌的投影,而不是 Sitemap 的生成日誌,判断标准會清晰很多。

lastmod 之外,蜘蛛還在看什么

HTTP 层的信号同样在起作用。Last-Modified 和 ETag 让蜘蛛可以用條件請求確認内容是否變化,命中 304 时能省下一次完整的响應传輸;Cache-Control 的 max-age 則影响它多快愿意再来確認一次。這些响應头與 Sitemap 里的 lastmod 如果互相矛盾,通常以响應头為准。

頁面自身展示的更新時間,例如文章頁的發布日期與更新日期,如果和 lastmod 差得太遠,也會让信号變得模糊。

落地时的取舍

對中小站点来说,比較稳妥的做法是:只给确實需要频繁再抓取的栏目開啟精确 lastmod,其余頁面保留一個大致准确的時間即可。與其追求所有 URL 都精确,不如保證被频繁訪問的那一批不出错。

如果暂时没有能力维護,宁可不寫這個字段,也比系統性寫错要好。抓取調度本来就有多個信号,一個持續失真的字段只會稀释站点其他信号的可信度。