搜尋抓取

站点地图索引與分片:把海量 URL 拆成可核對的批次

站点規模變大後,一份 Sitemap 装不下全部 URL,需要用索引文件串起多個分片。本文说清分片的數量與体积限制、索引文件的常见寫法错誤、按目錄或更新频率切分的思路,以及如何用抓取日誌核對分片是否被讀取,並附一份日常维護清單。

搜尋抓取

站点地图索引與分片:把海量 URL 拆成可核對的批次

站点規模上来之後,一份 Sitemap 往往装不下全部 URL。這时會用索引文件把多個分片串起来。分片怎么切、索引怎么寫、更新时動哪一份,會直接影响蜘蛛讀取的效率,也影响後續的核對工作。

先看清两個硬性上限

單個 Sitemap 文件有两個常见限制:URL 條數不超過 5 萬條,未压缩体积不超過 50MB。超過就得拆。拆分之後需要一個索引文件,把各個分片的地址列出来,通常命名為 sitemap.xml,而真正的分片用 sitemap-1.xml 這類名字。

分片文件可以是 gzip 压缩的,但索引文件本身不要压缩。這個细节经常被忽略,结果索引讀不出来,前面拆得再整齐也没有意义。

索引文件的寫法與常见错誤

  • 索引里只放分片地址,不要把普通頁面 URL 混進去。索引是“目錄的目錄”,混放會让解析层級變得混乱。
  • 不要在一個索引里指向另一個索引。索引嵌套不是标准做法,容易出現讀取中断。
  • 分片地址要與站点同域,跨域声明通常會被忽略。
  • robots.txt 里如果声明 Sitemap,一般寫索引文件的地址就够了,不必把每個分片都列一遍。

另外,分片地址寫错、文件被删、或者返回 404,都會让整批 URL 失去声明入口。這類問题在服務器日誌里表現為對分片文件的請求返回非 200,值得定期掃一遍。

按什么维度切分片

切分方式没有统一答案,但目标一致:让“更新”集中在少數几個文件里。常见的几種切法:

  • 按目錄或栏目切:适合内容板块清晰、更新节奏不同的站点。改版某個栏目时,只需要動對應的分片。
  • 按語言或地区切:多語言站点常用,便于分区域核對。
  • 按更新频率切:高频更新的頁面單獨一份,低频的另放,减少蜘蛛反复讀取大文件。
  • 按時間或 ID 段切:适合内容持續增長、歷史内容基本不動的站点。

如果每天新增几千條 URL,就把所有分片都重寫一遍,索引和分片的最後修改時間會不断變化,蜘蛛需要重新讀取的量也随之上升。让不變的分片保持原样,是拆分最實际的價值。

lastmod 用不用,怎么用

lastmod 的作用是告诉蜘蛛這個地址内容有變動。用它的前提是時間戳真實。如果每次生成分片都把 lastmod 刷成当天,短時間内可能看不出問题,時間一長,這個字段的參考價值就没了,蜘蛛可能干脆忽略它。

真實的時間戳才有意义。把 lastmod 当成“提醒工具”而不是“刷新按钮”,自己核對日誌时也更方便。

還有一種情况:頁面内容没變,但因為模板改動導致整批 lastmod 變化。這類批量變化會在抓取日誌里留下一片密集訪問,核對时容易誤判為大規模更新。

用抓取日誌核對分片

分片寫好並提交之後,可以通過日誌做几項基础核對:

  1. 分片文件本身被訪問的频率,是否和你的更新节奏大致對應。
  2. 分片請求的响應碼,是否長期稳定在 200。
  3. 從分片被讀取,到分片内 URL 被訪問,中間隔了多久。
  4. 哪些分片几乎没有被讀取過,是否存在地址寫错或長期未更新的情况。

需要說明的是,声明和讀取不等于收錄。分片被讀了,只說明入口被發現;頁面是否進入索引,還要看内容质量、重复度、站点整体表現等因素。分片的作用是把 URL 稳定地、可核對地暴露出来,而不是替代其他工作。

一套简單的维護清單

  1. 確認索引文件本身未被压缩,且能正常打開。
  2. 每個分片控制在限制以内,文件名與地址可预测。
  3. 更新时只重寫有變化的分片,其余保持不動。
  4. lastmod 只在内容實际變化时更新。
  5. 定期看分片請求的响應碼與訪問频率。
  6. 分片结构發生變化时,同步检查 robots.txt 中的声明地址。

把這些基础工作做稳,後面排查“URL 為什么没被發現”之類的問题时,至少可以先排除掉 Sitemap 這一层的不确定性。