搜索抓取

Sitemap 索引与分片:大站把抓取地图拆开后要注意什么

当站点 URL 数量上到几万条,单个 sitemap 文件会先撞上条数与体积上限,再拖慢蜘蛛的读取效率。本文说明 sitemap index 的作用、按栏目或时间拆片的思路、lastmod 该标在哪一层、分片地址的可抓取要求,以及如何用服务器日志判断拆片是不是真的被蜘蛛读到了。

搜索抓取

Sitemap 索引与分片:大站把抓取地图拆开后要注意什么

Sitemap 不是提交一次就完事的文件。当站点 URL 数量涨到几万甚至几十万,单个 sitemap 会先撞上协议里的硬性上限,再影响蜘蛛读取这份清单的效率。这时通常需要用到 sitemap index(索引文件)加分片的组织方式。

先看硬性上限:单文件装不下大站

协议给的范围很明确:一个 sitemap 文件最多 50000 条 URL,未压缩体积不超过 50MB。超过就得拆。但很多站点真正的问题不是超限,而是把几万条 URL 塞在一个文件里——蜘蛛每次来都要完整取一遍,页面只改动一点点,整份文件的更新时间也跟着变。

索引文件只做一件事:指向分片

sitemap index 里不写具体 URL,只写各个子 sitemap 的地址和 lastmod。结构大致包含根节点 sitemapindex,下面每条记录对应一个 loc 与一个 lastmod。需要注意的是,索引里不能再套索引,子 sitemap 必须是普通 sitemap,不能又是 index 文件。

按什么维度拆片

  • 按栏目拆:内容类型差别大时最清晰,某个栏目更新频繁,只影响它那一片。
  • 按时间拆:适合更新节奏快的站点,例如新闻按月分片,旧片内容基本不变。
  • 按内容类型拆:文章、商品、标签页分开,便于单独观察各类型的抓取表现。

每片的 URL 数量建议留出余量,不要顶到 50000,几万条以内更容易被完整读取。片数也不宜过多,几十片通常就够用,拆得太碎反而增加蜘蛛的请求次数。

lastmod 要标到分片这一层

索引里的 lastmod 是告诉蜘蛛这组 URL 有没有整体变化的关键信号。如果分片内容没变却一直刷新时间戳,蜘蛛会逐渐不再信任这个字段;反过来,某片新增了内容却没有更新 lastmod,可能过很久才会被重新读取。子 sitemap 内部的 lastmod 与索引层的 lastmod 最好保持一致逻辑。

分片地址必须自己能被抓到

  • robots.txt 里不要拦掉 sitemap 所在目录。
  • 分片地址返回 200,内容类型为 XML,不要被重定向到别的路径。
  • 不要在分片里塞入被 robots 禁止抓取的 URL 或已经下线的页面。
  • 分片里的 URL 尽量与站内链接可达的地址一致,避免地图和内链互相矛盾。

怎么验证拆片有没有生效

更实用的做法是看服务器日志:索引文件被请求的频率、返回状态码、蜘蛛取完分片后是否继续抓取其中的 URL。如果索引被频繁抓取,但子分片很少被请求,问题多半出在索引里的 lastmod 或分片地址本身。如果分片被正常读取,其中的新 URL 却迟迟没有进入抓取队列,就该回到内链和页面本身找原因,而不是继续加 sitemap 条目。

Sitemap 负责告诉蜘蛛这里有什么,内链负责证明这些 URL 值得抓。两者缺一,拆得再细的地图也只是一份清单。