搜尋抓取

Sitemap 索引與分片:大站怎么把 URL 清單交代清楚

Sitemap 索引文件和多分片的寫法,适合 URL 數量較大的站点。本文说清分片的數量與体积约束、哪些 URL 不该放進清單、按什么维度拆分,以及 Sitemap 與内鏈、canonical 如何保持一致,最後给出提交後的检查項。

搜尋抓取

Sitemap 索引與分片:大站怎么把 URL 清單交代清楚

Sitemap 不是给用戶看的頁面,而是给蜘蛛的一份 URL 清單。站点小的时候一個文件就够,URL 數量上到几萬、几十萬以後,就要用索引文件加多個分片的寫法。這套结构本身不复杂,容易出問题的是分片怎么拆、哪些 URL 不该放進去,以及它和内鏈讲的是不是同一件事。

索引文件解决的是“清單太長”

Sitemap 索引文件(sitemapindex)本身不含頁面 URL,只列出各個分片的地址。蜘蛛先讀索引,再按需要讀分片,不用一次把几十兆的文件全部拉走。對抓取预算有限的大站来说,這個结构能让蜘蛛分批讀取,而不是被一個巨大的文件卡住。

分片的两個硬约束

  • 單個 Sitemap 文件最多 50,000 條 URL。
  • 未压缩体积不超過 50MB,压缩後一般控制在 10MB 以内更稳妥。

超過就拆成多個分片,並在索引文件里逐個列出。分片地址尽量固定,不要每次生成都換路径,否則蜘蛛會反复發現“新”文件。

哪些 URL 不该寫進去

Sitemap 的價值在于表達“這些頁面我希望被抓、且可以被抓”。以下情况放進去只會浪費一次抓取:

  • 返回 404、410 或長期 5xx 的地址;
  • 被 robots.txt 屏蔽的目錄;
  • 需要登入、對蜘蛛返回登入頁的地址;
  • 带篩選、排序、追踪參數的重复頁,除非它們确實是獨立内容;
  • 同一内容的多個版本,canonical 指向別處的那些。

換句话说,Sitemap 里的每一條,都應该對應一個能直接打開、正文完整的頁面。

分片可以按什么维度拆

按目錄、按内容類型、按更新频率拆都行,關键是拆完之後能回答“哪個分片對應站点的哪一块”。常见做法:

  1. 文章、商品等主体内容單獨一個分片;
  2. 分類、标簽、列表頁一個分片;
  3. 更新频繁的栏目單獨拆出来,便于單獨調整生成频率;
  4. 歷史归档内容体积大、變動少,可以合並成一個大分片。

這样做的好處是,某個分片生成失敗或被誤改时,影响范围可控,不會让整站清單一起失效。

Sitemap 和内鏈要说同一件事

如果 Sitemap 里有一批 URL,站内却没有任何連結指向它們,蜘蛛即使從 Sitemap 抓到了,也不容易判断這些頁面的位置和重要性。两種情况要同时看:

  • Sitemap 里有、内鏈没有:检查是不是孤儿頁面,补一個合理的入口;
  • 内鏈里有、Sitemap 没有:如果頁面值得抓,把它加進去;不值得,就考虑是否需要這些頁面。

另外,Sitemap 里的 URL 形式要和頁面上實际使用的保持一致,包括大小寫、结尾斜杠、协议與域名。形式不统一,很容易被当成两個地址處理。

提交之後的检查

生成完不要只看文件能不能打開。至少確認几件事:索引文件里每個分片都返回 200;分片内容能被正常解析;抽查几條 URL,打開後狀態碼、canonical 和 Sitemap 里的寫法一致;文件里没有混進狀態異常的地址。更新频率不必刻意提高,URL 清單的内容變了再重新生成就行。

把 Sitemap 当成一份需要维護的清單,而不是一次生成就丢在服務器上的文件。它和内鏈、canonical 讲的是同一套 URL 關系,三者對不上时,先修資料,再谈抓取。