搜索抓取

Sitemap 分片与索引文件:站点地图变大之后该怎么拆

当站点 URL 数量增长到上万个,单个 sitemap 文件很容易触到 50,000 条和 50MB 的上限。本文讲清索引文件的作用与写法、分片拆分的几种思路、lastmod 的正确用法,以及循环引用、失效地址残留等容易踩的坑,帮助你把站点地图维护成一份可读、可用的清单。

搜索抓取

Sitemap 分片与索引文件:站点地图变大之后该怎么拆

当一个站点从几百个 URL 长到几万个,最初那个单独的 sitemap.xml 很快会碰到上限。这时候要处理的不是“要不要提交地图”,而是怎么把一个大地图拆成若干份,再让蜘蛛知道每份在哪里。这就是 sitemap 索引文件(sitemap index)存在的意义。

先弄清两个硬限制

主流搜索引擎对单个 sitemap 文件有两项约定:

  • 一个文件最多容纳 50,000 条 URL;
  • 未压缩状态下不超过 50MB。

超过任意一条,蜘蛛可能只解析到一部分,或者干脆放弃这个文件。这里的 50MB 指文件本身的体积,不是服务器上 gzip 压缩后的大小——压缩传输是允许的,但拆分与否仍要按未压缩体积来判断。

索引文件里放什么

索引文件本身不包含具体 URL,只列出各个分片地图的地址,相当于一本目录。蜘蛛先取到它,再按里面的地址逐个去取分片。

几点约束

  • 索引文件里最多列 50,000 个 sitemap;
  • 通常只能指向同一站点(按域名或目录判定)下的地址;
  • 索引指向索引一般不被支持,嵌套没有实际意义。

分片怎么拆更顺手

拆法没有唯一答案,但可以按用途来分:

  1. 按内容类型:文章、商品、标签页、专题页各一份,便于单独观察抓取情况;
  2. 按目录或栏目:与站内目录结构呼应,出问题时容易定位;
  3. 按更新节奏:日更内容和历史归档分开,lastmod 的信号会更清晰。

如果站点是程序生成的,建议在生成逻辑里就固定分片规则,而不是等文件超限了再临时切。分片数量保持稳定,比每次抓取都变来变去更容易被理解。

lastmod 别乱写

把 lastmod 全部写成当前时间,等于告诉蜘蛛“每天全站都变了”,这个信号很快就会失去参考价值。

lastmod 只在页面内容确实发生变化时更新。用程序批量刷新时间戳,短期看地图“很新”,但对方会逐渐降低对这个字段的信任,判断回爬又回到别的依据上。

几个常见的坑

  • 索引文件与分片文件互相引用,形成循环;
  • 分片里混入 robots.txt 已封禁的目录,蜘蛛取到后直接丢弃,白费一次请求;
  • 大量 301、404 的旧地址长期留在 sitemap 里,无人清理;
  • 把 sitemap 当成唯一发现渠道,内链里根本没有指向这些页面。

最后一条尤其要注意。sitemap 是一份交给蜘蛛的清单,它能帮助发现,但不改变页面本身的可达性。孤岛页面即使进了 sitemap,缺少内链和外部引用时,抓取节奏和后续判断通常也不会理想。

更新与提交

分片文件发生变化后,索引文件要同步更新;地址换了,旧文件名不要留着。提交方式上,可以在 robots.txt 中写明索引文件地址,也可以通过接口主动告知。需要提醒的是,通知只是提示,抓不抓、什么时候抓仍由对方决定,这一点没有捷径。

日常维护可以这样做:定期对比数据库里的有效 URL 与 sitemap 中的条目,把已下线的清理掉,把新增的补进去,让文件内容尽量与站点真实状态保持一致。地图越贴近现实,蜘蛛的每一次抓取就越不容易浪费。