站点規模小的时候,一個 Sitemap 文件就能装下所有頁面。但当 URL 數量到几萬、几十萬,或者不同栏目更新节奏差得很遠时,繼續把東西塞進一個文件,既寫起来吃力,也不方便判断蜘蛛到底抓走了哪一批。這时候通常的做法是拆成多個 Sitemap,再用一個索引文件把它們串起来。
什么情况下该上索引文件
先记住两個硬限制:一個普通 Sitemap 文件最多放 5 萬條 URL,未压缩体积不超過 50MB;索引文件本身同样最多引用 5 萬個子 Sitemap。只要接近這些數字,就该拆分。
還有几種不靠數量也能判断的情况:
- 不同栏目更新频率差很多,日报類天天變,帮助文档几個月不動。
- 站点有多個語言或地区版本,URL 前缀不同。
- 商品、文章、专题等類型混在一起,生成逻辑本身就分開了。
分片按什么维度切
切分的核心原則是:一個分片内部的頁面最好有共同特征。這样更新时可以整体重生成,也方便在日誌里观察某一類的抓取情况。
按内容類型或栏目
例如文章、商品、分類、标簽各一個文件。好處是同類頁面的生成規則一致,出問题时影响面清楚。
按更新频率
把每天變的頁面和几乎不變的頁面分開。频繁變化的文件被反复抓取是正常的,稳定頁面則没必要跟着一起更新,避免蜘蛛一次次拉取没有變化的大文件。
按語言或地区
多語言站点按語言拆分,配合 hreflang 使用时,索引關系更清楚,排查問题也不容易串线。
索引文件本身的几個要点
- 索引文件里只放子 Sitemap 的地址,不要混入普通頁面 URL。
- 索引不能再套索引,官方格式不支持多层嵌套。
- 所有地址寫完整绝對路径,包含协议和域名。
- 提交入口用索引文件本身,同时在 robots.txt 里声明它的位置。
- 子 Sitemap 的路径尽量稳定,不要每次生成都換文件名,否則等于让蜘蛛重新認识一遍。
常见寫错的地方
- 全站 lastmod 填成同一個生成時間,時間字段就失去參考意义。
- 索引文件里挂着一個已经 404 的子文件,蜘蛛反复抓到错誤地址。
- 分片命名带日期,每天換一個,歷史文件還留在索引里。
- 子文件内容超限被截断,後面的 URL 压根没出現在文件里。
- URL 參數、编碼處理不当,蜘蛛拿到的地址和真實地址對不上。
怎么驗證分片真的起了作用
看抓取日誌是最直接的办法。重点观察三件事:蜘蛛對各個子 Sitemap 的抓取频率、返回狀態碼是否正常、以及抓完 Sitemap 之後有没有出現對應的詳情頁抓取。如果某個分片長期被抓但里面頁面的抓取量没有變化,就要检查這個分片里的 URL 是不是本身有問题,比如被 robots 屏蔽、返回 404、或者與其他分片重复。
需要說明的是,Sitemap 只是 URL 發現渠道之一,提交和抓取都不等于收錄。它解决的是“让蜘蛛知道有這個地址”,能否被索引還要看内容质量、重复度和站点整体情况。
和其他發現渠道怎么配合
Sitemap 不该被当成唯一手段。新頁面上线时,從栏目頁、相關文章、面包屑等位置给出内鏈,通常比等 Sitemap 被重新抓取更快被發現。日常运营里更稳的组合是:内鏈负责主干路径,Sitemap 负责兜底和全量覆盖。
另外,無论分片寫得多規范,服務器不稳定都會让發現效率打折。抓取過程中频繁超时或返回 5xx,蜘蛛會降低訪問频率,Sitemap 抓取也會被拖慢。所以分片、内鏈、服務器响應速度這几件事,通常是放在一起看的,單獨優化其中一項,收益往往有限。
小结
頁面規模上来之後,把 Sitemap 分片並用索引文件匯總,能让你更清楚地掌握蜘蛛分批發現 URL 的過程。切分维度按内容類型、更新频率或語言来選,索引文件只放子文件地址並保持路径稳定,然後通過日誌確認每一批 URL 是否真的被带走。做到這一步,URL 發現這件事就從“提交完等结果”變成了可以观察和調整的日常動作。