搜尋抓取

Sitemap 该拆成几份:索引文件、條數上限與常见寫法错誤

Sitemap 寫對不等于寫完。本文說明單個文件的條數與体积上限、索引文件的用法,以及按内容類型、更新時間和語言拆分的選擇,並列出相對路径、屏蔽地址、乱改 lastmod 等常见错誤,帮你判断這份地址清單是否真的被蜘蛛讀到。

搜尋抓取

Sitemap 该拆成几份:索引文件、條數上限與常见寫法错誤

把 Sitemap 寫好,是让蜘蛛知道站点有哪些 URL 的最省事的方式之一。但很多人寫完一份 sitemap.xml 之後就不再管它,直到某天發現新頁面迟迟没有動静。問题往往不在“有没有 Sitemap”,而在“Sitemap 寫得對不對、拆得合不合理”。

一個 Sitemap 文件能装多少條 URL

按照通行的 Sitemap 协议,單個文件有两個硬性上限:

  • URL 條數不超過 50,000 條;
  • 未压缩体积不超過 50MB。

這两條是“或”的關系,任意一條超了,就需要拆分。超限的文件可能被直接忽略,或者只讀到一部分,结果就是後面那一大段 URL 既不在 Sitemap 里,也没人知道它們丢了。

如果内容本身结构简單,可以先按体积估算:一條 URL 加上 lastmod 大约几十到一百多字节,5 萬條通常還遠不到 50MB。反過来,如果每條都带較長的标簽或图片信息,体积可能先到顶。

Sitemap 索引文件:把多份 Sitemap 串起来

拆分之後,需要一份索引文件(sitemap index)来匯總。它的结构和普通 Sitemap 不同:

  • 根元素是 sitemapindex,下面每個 sitemap 元素包含一個 loc,指向子 Sitemap 的地址;
  • 可以带 lastmod,用来表示這份子 Sitemap 的更新時間;
  • 索引不能再嵌套索引,只能有一层。

索引文件本身也要遵守同样的條數和体积限制,不過 5 萬份子 Sitemap 這個量級,绝大多數站点一辈子也用不到。

该按什么维度拆分

拆分不只是為了绕過上限,也方便你後續观察。常见的几種切法:

  • 按内容類型:文章、商品、分類、标簽各一份。哪一類被抓取得慢,一眼能看出来。
  • 按更新時間:新近更新的内容單獨成一份,回訪节奏會更集中。
  • 按語言或地区:多語言站点按目錄切分,便于和 hreflang 對應。
  • 按數量平均切:内容類型單一时的兜底方案,但观察價值較低。

几種常见的寫法错誤

  • 用了相對路径。loc 必须是完整的绝對 URL,包含协议和域名。
  • URL 里带未轉义的字符,比如空格、中文、& 等,需要做编碼處理。
  • 把 robots.txt 里 Disallow 屏蔽掉的地址也放進去,等于自己和自己打架。
  • 把 404、410 或跳轉地址放進去。蜘蛛顺着抓過去只會浪費一次請求。
  • 每次生成都刷新所有 lastmod。時間戳全都一样时,這個字段基本失去了參考意义。
  • 把大量低质或重复參數頁面塞進去,稀释了真正需要被抓的地址。

放在哪里,蜘蛛怎么找到它

最通用的做法是放在站点根目錄,比如 https://example.com/sitemap.xml,然後在 robots.txt 里用 Sitemap 指令声明完整地址。這样即使蜘蛛是第一次来,也能顺着 robots.txt 找到入口。

除了 robots.txt,站長平台的手動提交也是一個入口,适合刚上线、外鏈還很少的新站。需要注意,這两條路都只是“告诉蜘蛛這里有東西”,並不等于“蜘蛛一定會来抓”。

別把 Sitemap 当成收錄保證

Sitemap 解决的是“蜘蛛知不知道這個 URL”,而不是“蜘蛛會不會抓、會不會收錄”。抓不抓取决于服務器响應、頁面质量、站内结构和整体抓取額度。

一個比較實用的自查顺序是:先確認 Sitemap 文件本身能被正常訪問、格式無誤;再看里面的 URL 是否都能返回 200;接着對比服務器日誌,看這些 URL 有没有被訪問過。如果日誌里几乎看不到 Sitemap 里的地址,那問题多半出在抓取入口或站点整体狀態上,而不是 Sitemap 的寫法。

最後一点:Sitemap 需要跟着内容更新。新頁面加進去、下线頁面移出来,否則時間一長,這份文件就會變成一份過期的地址清單,參考價值越来越低。