搜尋抓取

Sitemap 索引與分片:URL 數量上萬後,怎么让蜘蛛按批發現

当站点 URL 超過單個 Sitemap 的容量上限,就需要用索引文件拆成多個分片。分片怎么切、文件怎么命名、lastmod 怎么寫,會直接影响蜘蛛下次来讀哪些文件、能發現多少新 URL。本文讲清分片的基本規則、几種切分方式的取舍,以及几個容易被忽略的坑。

搜尋抓取

Sitemap 索引與分片:URL 數量上萬後,怎么让蜘蛛按批發現

站点刚上线时,一個 sitemap.xml 就能装下所有 URL。但当 URL 數量涨到几萬條,或者頁面地址很長導致文件体积變大,單個文件就會触到上限。這时候需要用 sitemap index(索引文件)把 URL 拆成多個分片,否則蜘蛛可能讀不完,甚至直接放弃這個文件。

單文件有硬上限,超了就得拆

按目前通用的規則,一個 Sitemap 文件最多包含 50000 條 URL,未压缩时体积不超過 50MB。两個條件任何一個先到,就需要拆分。拆分不是把文件随便切两半,而是把 URL 按某種逻辑分组,放進不同的子文件,再用一個索引文件把它們串起来。

  • URL 條數先到 5 萬:按栏目或時間切分;
  • 体积先到 50MB:通常是頁面地址很長,或包含了大量带參數的連結,需要先精简;
  • 两者都没到但讀取缓慢:检查服務器响應速度和压缩設定。

索引文件本身只做一件事

sitemap index 不包含任何頁面 URL,它只列出各個子 sitemap 的地址和各自的最後更新時間。蜘蛛先讀索引,再按里面的地址去讀分片。因此索引文件要保持稳定,文件名和路径不要频繁變動,否則蜘蛛每次都要重新確認一遍。

索引文件也要在 robots.txt 里声明。常见的做法是只声明索引文件,让蜘蛛顺着索引去找分片;也可以把分片一並声明,但要注意別把不再维護的舊文件留在里面。

分片怎么切:三種常见方式

按栏目或内容類型

文章、商品、标簽、帮助文档各占一個分片。這種方式便于维護,某個栏目更新频繁时,只需要重新生成對應的分片,其他分片的内容和 lastmod 保持不動。

按時間

按周或按月切分,适合更新量大的内容型站点。但要注意,老内容的分片一旦不再變化,就不要每次都重新生成並刷新時間,否則等于在告诉蜘蛛這個文件又變了。

按 ID 段

按數字区間切分,實現简單,适合内容 ID 连續的站点。缺点是可讀性差,排查問题时不容易判断某個 URL 落在哪個分片里。

lastmod 怎么寫才不會誤導

每個分片的 lastmod 應当是该文件内 URL 最近一次真實更新的時間,而不是文件生成的時間。如果每次跑脚本都寫目前時間,蜘蛛會以為内容有變化而反复来讀,讀完却發現没有更新,長期下来對這個文件的參考價值會下降。

lastmod 是一個提示,不是催促蜘蛛的工具。時間寫得越准,蜘蛛對它的參考價值越高。

Sitemap 负责發現,内鏈负责走進去

Sitemap 解决的是這個 URL 存在,它不保證蜘蛛一定會抓取。真正决定蜘蛛能不能從首頁一步步走到的,還是站内的連結结构。如果一批頁面只出現在 Sitemap 里,站内没有任何入口,蜘蛛即便讀到了地址,抓取優先級也會比較低。比較稳妥的做法是两者配合:重要頁面既有内鏈入口,也在 Sitemap 中列出。

几個常见的坑

  1. 分片切得太碎,几十個文件每個只有几百條 URL,蜘蛛讀取索引本身也要花時間,反而增加负担。
  2. 舊分片不再更新,却一直留在索引里,蜘蛛會持續訪問這些没有内容的文件。
  3. 分片放在別的域名下,需要注意跨域声明的限制,否則可能讀取失敗。
  4. 分片里混入了 404、403 或重定向地址,會消耗抓取资源,也容易让蜘蛛對整份文件打折扣。
  5. 索引文件没有在 robots.txt 中声明,導致蜘蛛只能靠外鏈或歷史记錄才發現它。

检查分片是否生效,可以看抓取日誌里蜘蛛對各 sitemap 文件的訪問频率和返回狀態,也可以在站長平台里對比已提交與已發現的 URL 數量。两者長期對不上,通常不是 Sitemap 寫得不够多,而是分片结构或内鏈入口出了問题。