站点小的时候,一个 Sitemap 就够了。等 URL 涨到几万条,往往会撞上一个硬边界:单个 Sitemap 文件最多 5 万条 URL、未压缩体积不超过 50MB。超出的部分不会被读取,于是多出来的页面等于没交出去。这时候要做两件事:把 URL 拆成分片,再用索引文件把分片串起来。
分片和索引各管什么
分片文件(子 Sitemap)里放的是页面 URL 本身,一条一条列。索引文件(sitemap index)里放的是分片文件的地址,不出现任何页面 URL。蜘蛛先读索引,再按索引里的地址逐个去读分片。层级只有这两层,索引下面不能再套索引。
怎么切分片
- 按目录切:/product/、/article/、/tag/ 各一个文件,出错时容易定位。
- 按内容类型切:文章、商品、问答各一份,更新频率不同,lastmod 也更好给。
- 按更新时间切:新闻类站点可以按月或按周切,老内容分片基本不变。
- 每片控制条数:不必都塞到 5 万条。几千到一两万条一片,读取失败时影响面更小。
拆分本身不影响抓取,但切得清楚,后面排查问题时省事。
索引文件里最容易写错的几处
- 把页面 URL 混进索引。索引里只认分片地址,混入页面地址等于白写。
- 协议或域名不统一。索引里写 https,分片里写 http,或者 www 与非 www 混用,蜘蛛会当成两套地址。
- gzip 分片没标对。压缩后的文件一般以 .xml.gz 结尾,同时要让服务器正确返回该文件的类型,否则可能被当成下载内容。
- 分片地址返回 404 或 301。索引指向的地址应当是可直接访问的最终地址,不要让它再跳一次。
- lastmod 全站同一个时间。所有分片都标同一个时间戳,参考价值会打折;分批给、和实际更新对齐更实在。
哪些 URL 不该出现在分片里
分片是一份希望被看到的清单,不是全站地址导出。以下几类放进去意义不大,还会稀释清单本身的信号:
- 返回 301/302 的旧地址,最终地址另有一份。
- 已经 404、410 的死链。
- 带 noindex 的页面,或 robots.txt 里被拦住的路径。
- 大量参数组合、筛选结果页,除非这些页面确实需要被单独抓取。
- 同一内容的不同 URL 变体,除非你能确定哪一个是规范版本。
分片之外,蜘蛛还得有路可走
提交分片只是把地址递过去,不等于蜘蛛会挨个访问,也不等于页面会被收录。分片解决的是你知不知道这些 URL,内链解决的是这些 URL 在站内处于什么位置。一个页面在分片里、在站内却没有任何入口,长期看仍然容易被冷落。
分片是清单,内链是路径。清单可以很长,路径必须真实存在。
交付之后怎么确认有没有被读到
- 在服务器日志里筛分片文件的访问记录,看蜘蛛是否按索引顺序读过。
- 观察分片是否被频繁重复读取;如果某个分片长期无人访问,检查它是否还在索引里、地址是否可达。
- 分片更新后不必立刻重写全部文件,只改变动的部分,减少无意义的重复读取。
- 索引文件本身保持稳定地址,不要每次改动都换路径。
站点规模再大,Sitemap 也只是一条辅助发现路径。它的价值在于把散落的 URL 集中起来,让蜘蛛少走弯路;至于抓不抓、抓多少,仍然取决于站点结构、响应速度和内容更新节奏。分片做得规范,至少能让这份清单不被浪费。