搜尋抓取

Sitemap 分片與索引文件:站点地图變大之後该怎么拆

当站点 URL 數量增長到上萬個,單個 sitemap 文件很容易触到 50,000 條和 50MB 的上限。本文讲清索引文件的作用與寫法、分片拆分的几種思路、lastmod 的正确用法,以及循环引用、失效地址残留等容易踩的坑,帮助你把站点地图维護成一份可讀、可用的清單。

搜尋抓取

Sitemap 分片與索引文件:站点地图變大之後该怎么拆

当一個站点從几百個 URL 長到几萬個,最初那個單獨的 sitemap.xml 很快會碰到上限。這时候要處理的不是“要不要提交地图”,而是怎么把一個大地图拆成若干份,再让蜘蛛知道每份在哪里。這就是 sitemap 索引文件(sitemap index)存在的意义。

先弄清两個硬限制

主流搜尋引擎對單個 sitemap 文件有两項约定:

  • 一個文件最多容纳 50,000 條 URL;
  • 未压缩狀態下不超過 50MB。

超過任意一條,蜘蛛可能只解析到一部分,或者干脆放弃這個文件。這里的 50MB 指文件本身的体积,不是服務器上 gzip 压缩後的大小——压缩传輸是允许的,但拆分與否仍要按未压缩体积来判断。

索引文件里放什么

索引文件本身不包含具体 URL,只列出各個分片地图的地址,相当于一本目錄。蜘蛛先取到它,再按里面的地址逐個去取分片。

几点约束

  • 索引文件里最多列 50,000 個 sitemap;
  • 通常只能指向同一站点(按域名或目錄判定)下的地址;
  • 索引指向索引一般不被支持,嵌套没有實际意义。

分片怎么拆更顺手

拆法没有唯一答案,但可以按用途来分:

  1. 按内容類型:文章、商品、标簽頁、专题頁各一份,便于單獨观察抓取情况;
  2. 按目錄或栏目:與站内目錄结构呼應,出問题时容易定位;
  3. 按更新节奏:日更内容和歷史归档分開,lastmod 的信号會更清晰。

如果站点是程序生成的,建议在生成逻辑里就固定分片規則,而不是等文件超限了再临时切。分片數量保持稳定,比每次抓取都變来變去更容易被理解。

lastmod 別乱寫

把 lastmod 全部寫成目前時間,等于告诉蜘蛛“每天全站都變了”,這個信号很快就會失去參考價值。

lastmod 只在頁面内容确實發生變化时更新。用程序批量刷新時間戳,短期看地图“很新”,但對方會逐渐降低對這個字段的信任,判断回爬又回到別的依據上。

几個常见的坑

  • 索引文件與分片文件互相引用,形成循环;
  • 分片里混入 robots.txt 已封禁的目錄,蜘蛛取到後直接丢弃,白費一次請求;
  • 大量 301、404 的舊地址長期留在 sitemap 里,無人清理;
  • 把 sitemap 当成唯一發現渠道,内鏈里根本没有指向這些頁面。

最後一條尤其要注意。sitemap 是一份交给蜘蛛的清單,它能帮助發現,但不改變頁面本身的可達性。孤岛頁面即使進了 sitemap,缺少内鏈和外部引用时,抓取节奏和後續判断通常也不會理想。

更新與提交

分片文件發生變化後,索引文件要同步更新;地址換了,舊文件名不要留着。提交方式上,可以在 robots.txt 中寫明索引文件地址,也可以通過接口主動告知。需要提醒的是,通知只是提示,抓不抓、什么时候抓仍由對方决定,這一点没有捷径。

日常维護可以這样做:定期對比資料库里的有效 URL 與 sitemap 中的條目,把已下线的清理掉,把新增的补進去,让文件内容尽量與站点真實狀態保持一致。地图越贴近現實,蜘蛛的每一次抓取就越不容易浪費。