搜索抓取

Sitemap 分片与索引文件:站点变大之后,入口该怎么拆

站点页面变多以后,单个 sitemap 会变得臃肿,蜘蛛每次都要下载完整一份。这篇文章讲分片的几种切法、索引文件的写法,以及 lastmod、压缩、重复 URL 这些容易踩的细节,帮你在维护成本和抓取开销之间找到平衡点。

搜索抓取

Sitemap 分片与索引文件:站点变大之后,入口该怎么拆

站点小的时候,一个 sitemap.xml 就够了。页面到几万条以后,单文件会变得又大又难维护,蜘蛛每次来都要下载完整一份,站点自己生成一次也要跑很久。这时通常要做的不是“继续往一个文件里塞”,而是拆分。

分片不是为了绕开上限

常见的限制是单个 sitemap 文件最多 5 万条 URL、未压缩体积不超过 50MB。很多人拆分的唯一理由是逼近这个上限,其实更实际的理由是:分片之后,某个栏目更新时只需要重新生成那一片,蜘蛛也只需要重新读那一片,抓取开销和维护成本都会下来。

反过来,如果站点只有几千条 URL,硬要切成二三十个文件也不划算。每个分片都是一次独立的请求,索引文件本身也要被抓,切得太碎会白白增加抓取次数。

按什么维度切

  • 按栏目或目录切:博客、商品、帮助中心各一片,和站内结构大致对应,改动范围清晰。
  • 按更新时间切:把最近更新的内容单独成片,适合新闻、活动这类更新频繁的站点。
  • 按内容类型切:文章、图片、视频、专题各一片,方便单独提交和排查。
  • 不推荐按字母或 ID 区间机械切分,除了数量均匀之外没有别的意义。

一个常见做法是“全量片 + 增量片”:全量片覆盖所有可索引 URL,增量片只放近期更新或新增的 URL。全量片更新频率低,增量片更新频繁,蜘蛛两次来访之间看到的变化会更集中。

索引文件怎么写

分片多了之后,需要一个 sitemap index 文件把它们列出来,路径通常是 /sitemap.xml。索引文件里的每个 sitemap 条目只写 loc 和可选的 lastmod,不要写 priority、changefreq 这些页面级字段。

索引文件本身也是被抓取的对象。它写得越干净,蜘蛛越容易顺着它把分片排进队列。
  • loc 要用绝对地址,并且和文件实际可访问的地址一致,不要经过跳转。
  • 分片的 lastmod 与实际内容更新时间对齐,不要每次生成 sitemap 都刷新成当前时间。
  • 索引嵌套层数别太深,一般一层索引指向分片就够了。
  • 分片文件用 gzip 压缩没问题,注意 50MB 的限制是按未压缩体积算的。

几个容易忽略的点

  1. 只放返回 200 且允许索引的 URL。被 robots 屏蔽、需要登录、参数重复的地址不要写进去,写了也只是让蜘蛛白跑一趟。
  2. 一个 URL 只出现在一个分片里,重复会让蜘蛛反复判断该用哪条。
  3. 分片里的地址最好和站内链接能互相印证。如果某个 URL 只存在于 sitemap、站内没有任何入口,它的抓取优先级通常不会高。
  4. 站点改版后,旧分片要及时替换,别让已经 404 的地址继续留在索引文件里。

怎么知道分片有没有被读

看服务器日志里 sitemap 相关路径的请求情况:哪些分片被请求过、频率如何、返回状态是否正常。如果某个分片长期没人访问,先检查它是否被索引文件正确引用,再看 robots.txt 是否挡住了路径。

sitemap 的定位是补充入口,不是替代内链。它告诉蜘蛛“这些地址存在”,但一个页面能不能被稳定抓取、会不会被当作重要页面,更多还是取决于站内链接和内容本身。两者配合,入口才会稳。