搜索抓取

Sitemap 分片与索引文件:URL 数量上来之后怎么交给蜘蛛

当站点 URL 从几千涨到几万,单个 Sitemap 往往会碰到 5 万条和 50MB 的上限。这时候需要拆成分片,再用索引文件把它们串起来。分片怎么切、索引怎么写、lastmod 怎么给、哪些 URL 不该放进去,都会影响蜘蛛顺着这份清单走得多顺。

搜索抓取

Sitemap 分片与索引文件:URL 数量上来之后怎么交给蜘蛛

站点小的时候,一个 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 不该出现在分片里

分片是一份希望被看到的清单,不是全站地址导出。以下几类放进去意义不大,还会稀释清单本身的信号:

  1. 返回 301/302 的旧地址,最终地址另有一份。
  2. 已经 404、410 的死链。
  3. 带 noindex 的页面,或 robots.txt 里被拦住的路径。
  4. 大量参数组合、筛选结果页,除非这些页面确实需要被单独抓取。
  5. 同一内容的不同 URL 变体,除非你能确定哪一个是规范版本。

分片之外,蜘蛛还得有路可走

提交分片只是把地址递过去,不等于蜘蛛会挨个访问,也不等于页面会被收录。分片解决的是你知不知道这些 URL,内链解决的是这些 URL 在站内处于什么位置。一个页面在分片里、在站内却没有任何入口,长期看仍然容易被冷落。

分片是清单,内链是路径。清单可以很长,路径必须真实存在。

交付之后怎么确认有没有被读到

  • 在服务器日志里筛分片文件的访问记录,看蜘蛛是否按索引顺序读过。
  • 观察分片是否被频繁重复读取;如果某个分片长期无人访问,检查它是否还在索引里、地址是否可达。
  • 分片更新后不必立刻重写全部文件,只改变动的部分,减少无意义的重复读取。
  • 索引文件本身保持稳定地址,不要每次改动都换路径。

站点规模再大,Sitemap 也只是一条辅助发现路径。它的价值在于把散落的 URL 集中起来,让蜘蛛少走弯路;至于抓不抓、抓多少,仍然取决于站点结构、响应速度和内容更新节奏。分片做得规范,至少能让这份清单不被浪费。