搜索抓取

Sitemap 索引与分片:URL 清单变长后,怎么稳定交给蜘蛛

站点 URL 数量增长后,单个 Sitemap 很快会碰到条目数和体积上限。本文讲清索引文件与分片的写法、切分维度,以及 lastmod、robots.txt 和内链该怎么配合,让蜘蛛能稳定取走完整的 URL 清单。

搜索抓取

Sitemap 索引与分片:URL 清单变长后,怎么稳定交给蜘蛛

Sitemap 用得久了,URL 数量迟早会超过单个文件能承载的范围。这时真正决定蜘蛛能不能稳定拿到清单的,不再是「有没有提交 Sitemap」,而是索引文件和分片组织得是否清楚。

为什么单个 Sitemap 迟早要拆

主流搜索引擎对单个 Sitemap 文件有明确上限:条目数不超过 5 万条,未压缩体积不超过 50MB。只要站点在持续增长,这两条线都会碰到。除了硬限制,拆分的实际意义还在于:

  • 不同栏目更新频率差别很大,全站挤在一个文件里,每次都要重新生成、重新读取;
  • 单个文件过大时,抓取和传输本身就会变慢,出错概率随之上升;
  • 某一类内容出了问题,只需排查对应分片,不必全站返工。

拆分之后,需要一个 Sitemap 索引文件把各个分片串起来:蜘蛛先读索引,再按索引里的地址逐个取分片。

索引文件与分片的写法要点

索引文件只放分片地址

索引文件使用 sitemapindex 结构,每一项是 sitemap 标签,包含 loc 和可选的 lastmod,指向一个分片文件。常见错误是把 url 标签直接写进索引文件,或者把 sitemapindex 与 urlset 混在同一个文件里,这会让解析直接失败。

分片文件仍然是普通 Sitemap

每个分片本身是一个完整的 urlset,里面每一条 URL 才是真正要给蜘蛛的地址。分片地址应当是固定、能直接返回 200 的地址,不要带会变化的查询参数,也不要经过重定向。

lastmod 各管一段

分片里的 lastmod 描述的是某条 URL 的更新时间,索引文件里的 lastmod 描述的是这份分片清单本身的更新时间,两者含义不同。不要为了「看起来更新」每次都把全量时间改掉,时间戳长期不准,蜘蛛会逐渐降低对它的信任。

分片按什么维度切更实用

切分维度没有唯一答案,关键是让每一片内部的更新节奏相对一致,既方便维护,也方便蜘蛛按需取用:

  • 按内容类型:文章、商品、分类、标签各成一片,出错时影响面可控;
  • 按更新时间:新增或近期改动的 URL 单独成片,便于重点传递;
  • 按语言或地区:多语言站点按目录切,避免互相干扰;
  • 按数量均分:纯按 ID 或时间分段,适合超大规模站点,但每片数量别太悬殊。

单个分片控制在 1 万到 3 万条比较稳妥。数量太少会制造大量小文件请求,顶到上限则每次改动都要重写整个文件。

和 robots.txt、内链怎么配合

robots.txt 里用 Sitemap 指令指向索引文件即可,不必把每个分片都列出来,索引文件本身会把分片串起来。同时要记住,Sitemap 是补充手段,不是内链的替代品。一个写在 Sitemap 里、站内却没有任何入口的 URL,往往只能被零星抓取,很难形成稳定的抓取路径。清单和入口两条路都通,URL 才会被持续关注。

上线前的一份自查清单

  1. 索引文件能被直接访问,返回 200,Content-Type 为 XML 或纯文本;
  2. 分片地址未被 robots.txt 屏蔽,也不依赖登录或 Cookie;
  3. 索引文件里只有 sitemap 标签,分片里只有 url 标签;
  4. 所有 loc 使用完整绝对地址,且与实际可访问地址完全一致;
  5. 启用压缩传输时,确认服务端正确返回 gzip 编码,避免解压失败;
  6. 抽查若干分片,确认其中 URL 确实返回 200,而不是 404 或跳转。
索引和分片解决的是「清单怎么交」的问题;抓取顺序和频率,仍然由站点质量、内链结构和服务器响应决定。

把 URL 清单拆成结构清晰、各自独立更新的分片,并保持长期稳定,蜘蛛取用清单的成本会明显下降。剩下的功夫,还是要花在页面本身和内链上。