先看现象。六万条地址按两万条分成三个 sitemap 分片,脚本每天凌晨全量重生成,每次输出都把 lastmod 写成运行当天。抓两天的文件对比,字节数几乎一样,只有时间戳全部变了。蜘蛛每天早上七点准时来把三个分片全抓一遍。

排查方向其实有限,先把可能性排一排。生成脚本取的是运行时间,而不是文章的真实修改时间。另一种情况是分片按 ID 区间切分,任一篇文章更新都会让整片重写。

还有一种情况,索引文件里的 lastmod 跟着一起刷新,等于告诉蜘蛛整站都变了。

另外,生成后还做了 gzip,压缩包的时间戳变化同样被当成新文件。

连续两天保存 sitemap,做一次哈希对比

for d in 1 2; do curl -s https://www.example.com/sitemap-1.xml -o s$d.xml; done; md5sum s1.xml s2.xml

再往下把 lastmod 改成文章修改时间,按时区输出

date('c', get_post_modified_time('U', true, $post_id))

接着分片只重写有变更的那一份,其余保持字节一致

SELECT ID, post_modified FROM wp_posts WHERE post_modified > CURDATE() - INTERVAL 1 DAY;

等前面都确认过,再重生成后观察下一个抓取周期的分片请求数

awk '$7~/sitemap-/{print $7}' access.log | sort | uniq -c

怎么算真的好了,看的是同一批现象。两份 sitemap 的哈希只有包含新文的那一片不同,蜘蛛从每天全量抓变成只抓变化的分片。

全量重生成本身不算错,错在把重生成时间当成内容更新时间,字节变化就等于给蜘蛛发了一次虚假更新。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189