搜索抓取

Sitemap 索引与分片:几万条 URL 的清单该怎么组织

单个 Sitemap 文件有 5 万条 URL 和 50MB 两条上限,超了可能整份失效。本文讲索引文件与子清单怎么拆分、lastmod 怎么写才可信、哪些 URL 不该放进清单,以及清单文件自己响应不稳定时,对 URL 发现的影响。

搜索抓取

Sitemap 索引与分片:几万条 URL 的清单该怎么组织

站点大到一定程度,把所有 URL 塞进一个 Sitemap 文件,问题往往不是蜘蛛看不看,而是文件本身难维护、难定位,出了问题也不知道是哪一类页面受影响。把清单拆成索引加多个子文件,是 URL 发现这条链路上比较实用的一步。

为什么要拆:先看两条硬上限

单个 Sitemap 文件有明确的边界,越过之后不是抓得慢一点,而是文件可能被判为无效,里面的 URL 一条都进不了发现队列。

  • 单个文件最多 50,000 条 URL。
  • 未压缩体积不超过 50MB,用 gzip 上传时,判断标准仍是解压后的大小。
  • 索引文件本身最多指向 50,000 个子 Sitemap。

按什么维度分片

常见的做法是让每个子文件对应一类边界清晰的内容,出问题时能快速定位范围。

  • 按内容类型:文章、商品、分类、专题各一份,便于对照日志判断哪一类没被取走。
  • 按语言或地区:多语言站点分开,与各自的目录结构对应起来。
  • 按更新频率:更新频繁的放一份,长期不变的归档内容放另一份,减少整份文件的重复抓取压力。

分片粒度不必太细。几十个子文件通常够用,拆成几百个反而增加蜘蛛读取索引文件的次数。

索引文件怎么写、放在哪

索引文件用 sitemapindex 结构,每一项指向子 Sitemap 的完整绝对地址,且应与索引文件同域。robots.txt 里一般只声明索引文件这一条,蜘蛛会顺着它去取各个子文件。

清单写得再全,也只是告诉蜘蛛这里存在一个地址;是否抓取、什么时候抓取,仍由蜘蛛自己判断。

lastmod:写真的,别批量刷

lastmod 是清单里少数会被参考的字段,但前提是它可信。

  • 只写内容发生实质变化的日期,改错别字、换广告位不算。
  • 用带时区的 ISO 8601 格式,例如 2024-05-20T08:30:00+08:00,避免按 UTC 误判。
  • 全站批量刷新 lastmod,短期可能带来回爬,长期会让这个字段失去参考价值。
  • changefreq 与 priority 目前基本被忽略,不必在这两个字段上花太多精力。

清单里该放哪些 URL

  1. 只放返回 200 且允许被索引的规范地址。
  2. 不放 301、302 跳转地址,也不放 noindex 页面和 404 页面。
  3. 与页面 canonical 保持一致,避免清单里一个地址、页面里指向另一个地址。
  4. 筛选、排序等参数页默认不放,除非它确实有独立内容和搜索需求。
  5. 分页的后续页可以放,但不比内容页更重要,数量大时要有取舍。

清单文件自己也要能稳定返回

很多站点把清单当成静态资源随手一放,结果所在目录响应慢、偶发 5xx,或者被 WAF 误拦。清单取不到,后面所有 URL 都无从发现。几个基本要求:

  • 响应稳定,尽量走缓存或 CDN,降低回源压力。
  • 不要用多跳重定向引导到清单文件,多余的跳转会拖慢处理。
  • 压缩上传没问题,但解压后要能被正常解析,不出现编码错误。
  • 更新频繁的子清单可以设较短缓存,归档类清单设较长缓存。

怎么确认清单真的起了作用

可以按三步检查:一是看搜索后台的 Sitemap 报告,确认文件被读取、解析成功的 URL 数量是否符合预期;二是翻服务器日志,看蜘蛛是否按索引文件逐条请求子清单,请求频率和状态码是否正常;三是抽样抓取清单里的若干 URL,核对状态码、canonical 与清单记录是否一致。三者对不上时,先排查清单本身,再排查页面。

Sitemap 是 URL 发现的辅助通道,不是抓取配额。把它组织清楚、保持字段可信,比反复提交、频繁改动格式更有效。