搜索抓取

Sitemap 索引与分片:URL 数量变大后怎么组织提交清单

当站点 URL 增长到几万条,单个 Sitemap 文件会变得笨重,每次更新都要整份重写。本文讲讲分片的几种切法、索引文件的写法要点、空文件与幽灵地址等常见问题,以及 Sitemap 与内链在 URL 发现上如何各自分工,让抓取入口更有秩序。

搜索抓取

Sitemap 索引与分片:URL 数量变大后怎么组织提交清单

什么时候该把 Sitemap 拆开

单个 Sitemap 文件有容量上限,常见约束是 5 万条 URL 和 50MB(未压缩)这两条线,任一条先到就要考虑拆。实际动手的时机往往比这个更早:当站点已经有几万条需要被蜘蛛发现的地址,或者不同栏目之间的更新节奏差异很大时,把所有 URL 塞进一个文件里,每次有新内容就得重写整份清单。蜘蛛每次拉到的都是一份几乎全新的文件,反而不好判断哪一段才是新出现的部分。

拆分的本质,是给蜘蛛一份分段清单,让它按需抓取其中一段,而不是每次全量拉取。

几种常见的分片维度

  • 按栏目:商品、文章、问答、标签页各一个文件,栏目更新频率不同,互不干扰。
  • 按时间:按月或按季度切片,老文件基本冻结,新文件滚动生成。
  • 按语言或地区:多语言站点按语言目录拆,可以配合 hreflang 一起维护。
  • 按页面类型:详情页、列表页、聚合页分开,方便单独排查某一类 URL 的发现情况。

维度不必贪多,选一到两个稳定不变的切法即可。切分维度频繁变化,等于每次都在给蜘蛛换一套清单结构。

索引文件的写法要点

  • 索引文件里只放 Sitemap 的地址,不要再混入普通页面 URL。
  • 索引文件一般不再嵌套索引,一层就够用。
  • 每个子 Sitemap 的地址都必须是能正常打开、返回 200 的地址。
  • 子文件里的 lastmod 尽量反映真实更新时间,不要全站统一写同一时刻。
  • 索引自身的 lastmod 也值得维护,新增分片时更新它才更有参考价值。

容易踩的几个坑

  • 空文件:文件存在但没有任何 URL,或者内容被模板填充成占位符。
  • 幽灵地址:清单里包含已经 404、301 到别处,或者被 robots.txt 屏蔽的 URL。
  • 不做压缩:几万条 URL 的纯文本体积不小,支持 gzip 时压缩一下能省下带宽和抓取耗时。
  • 域名写错:尤其是 www 与非 www、http 与 https 混用时,子文件里的地址容易对不上。
  • 参数地址全量写入:筛选、排序生成的地址一股脑塞进清单,文件迅速膨胀,真正重要的页面反而被淹没。

提交与更新节奏

索引文件建好后,一般在 robots.txt 里声明地址,再在站长平台提交一次即可,不需要每天重复提交。子分片的更新可以跟着内容实际产出的节奏走:日更栏目每天重建对应分片,老分片保持不动。频繁重写而内容没变,会让 lastmod 这个信号慢慢失去参考价值。

清单只是告诉蜘蛛这里有一批地址,它不保证被抓取,更不保证被收录。发现和抓取之间,还隔着优先级判断。

Sitemap 与内链的分工

Sitemap 解决的是存在性,内链解决的是可达性。一个 URL 只出现在清单里、站内没有任何链接指向它,蜘蛛即便从清单里看到它,也缺少再次访问和评估上下文的理由。反过来,内链结构清晰但 URL 数量极大时,Sitemap 能补上清单式的覆盖。

比较稳妥的组合是:重要栏目和详情页靠内链保证可达,Sitemap 负责补齐数量庞大、位置较深的那部分地址,两边指向的 URL 集合尽量一致。如果差异长期存在,先查清是哪一边漏了,而不是直接删掉一边。

一份自查清单

  1. 单个文件是否还在 5 万条、50MB 的边界内。
  2. 索引文件里是否只包含 Sitemap 地址。
  3. 每个子文件是否能直接打开并返回 200。
  4. 清单里的 URL 是否都是可索引的规范地址。
  5. lastmod 是否反映真实更新时间。
  6. Sitemap 里的 URL 集合与内链可达的 URL 集合差多少。