当一個站点的 URL 數量從几百涨到几萬、几十萬,單個 Sitemap 文件很快就會顶到上限。Sitemap 协议中,一個文件最多容纳 50000 個 URL,未压缩体积不超過 50MB。超過這個量級,就需要 sitemap index(索引文件)把多個分片串起来。這一步看起来只是“拆文件”,但它實际上會影响蜘蛛發現 URL 的节奏、單個文件的抓取成本,以及更新信号的准确度。
為什么要拆:三個現實問题
第一是解析成本。蜘蛛每次讀取 Sitemap,都要把整個文件下载下来並解析。如果一個大文件里绝大多數 URL 長期没有變化,這部分消耗就偏向浪費。拆成小块之後,蜘蛛可以按需讀取變化更频繁的分片。
第二是更新信号。分片之後,每個分片可以有自己的 lastmod,越贴近该批 URL 的真實變更時間,信号越有意义。所有分片寫同一個時間,等于告诉蜘蛛“全站每天都在變”,久而久之這個字段就失去參考價值。
第三是故障范围。某個分片因為体积過大而超时、格式出错或返回異常,只會影响這一批 URL,不會把整份地图拖下水。
分片常见的几種切法
按内容類型切是最直接的做法,比如文章、商品、分類、标簽各占一個分片。好處是更新频率接近的 URL 聚在一起,坏處是当某一類數量暴涨时需要重新調整。
按更新時間切更适合内容持續产出的站点,例如按月或按季度生成增量分片,歷史内容放進归档分片,這類分片几乎没有變化,蜘蛛不需要反复讀。
按目錄或多語言目錄切,适合结构本来就分层的站点,分片地址和站点结构對應,排查問题时也容易定位。
需要注意的是不要切得太碎。几百個小文件意味着蜘蛛要額外抓取索引文件並逐條請求,而每次請求都要占用抓取资源。通常每個分片放几千到几萬條 URL 比較稳妥,具体取决于站点被抓取的频率。
索引文件本身的寫法要点
- 索引文件只能引用 Sitemap 文件,不要再引用另一個索引文件,嵌套层級對蜘蛛並不友好。
- 索引里的 lastmod 可以填寫,用来表示该分片内容的整体變更時間,但同样要真實。
- 索引文件地址要固定,改名或換目錄後记得同步更新 robots.txt 和後台提交记錄。
- robots.txt 中的 Sitemap 指令指向索引文件即可,不必把几十個分片地址一一列出。
分片後容易踩的几個坑
- 所有分片的 lastmod 都寫成同一天,等于没有提供任何變化信息。
- 分片 URL 返回 200,但内容是一個空列表,蜘蛛會認為该分片有效却無内容。
- 分片被 CDN 或缓存层儲存太久,新 URL 迟迟不出現,抓取节奏被拉長。
- 分片里混入大量 301、404 或 noindex 的地址,占用了本该留给有效頁面的抓取机會。
- 分片里包含被 robots.txt 屏蔽的路径,蜘蛛讀取地图时會直接跳過這些條目。
分片與抓取調度
蜘蛛會根據自身抓取能力和站点優先級决定什么时候来讀 Sitemap。把變化频繁的内容單獨放進一個分片、把稳定的歷史内容放進另一個分片,能减少蜘蛛每次重新解析的量。同时也要清楚,Sitemap 主要解决“發現”問题,让蜘蛛走到站点深處,仍然依赖内鏈结构。分片做得再好,也不该成為 URL 的唯一入口。
上线前的检查清單
- 逐個訪問分片 URL,確認返回 200 且内容是结构正确的 XML。
- 检查每個分片的 URL 條數與字节數,都在协议限制以内。
- lastmod 使用标准格式,並與頁面的真實更新時間對得上。
- robots.txt 中只保留索引文件地址,且域名與协议一致。
- 提交索引文件後,观察後台的抓取統計,確認分片被正常讀取。
分片的意义不是把文件變小,而是让蜘蛛用更少的請求,拿到更准确的變化信息。
把 Sitemap 当成一份需要長期维護的清單,而不是一次生成就再不過問的文件,蜘蛛對站点的理解會更稳定一些。