搜尋抓取

Sitemap 分片與索引文件:大站点的 URL 清單该怎样拆

当站点 URL 數量上萬,單文件 Sitemap 往往难以承载。本文說明清單文件的條數與体积上限、索引文件的组织方式、按内容類型或更新時間拆分分片的思路,以及 lastmod 的寫法、分片返回 404 等常见問题,並给出用服務器日誌核驗分片是否被正常抓取的方法。

搜尋抓取

Sitemap 分片與索引文件:大站点的 URL 清單该怎样拆

Sitemap 是最常见的 URL 發現入口,但站点規模上去之後,把所有地址塞進一個文件通常行不通。搜尋引擎對單個 Sitemap 有明确的條數和体积上限,超出部分需要拆成多個分片,再用一個索引文件把它們串起来。分片做得好,蜘蛛能稳定地拿到 URL 清單;做得乱,反而會让一批地址長期停留在待抓队列之外。

單文件的两個硬约束

常见的處理原則是:

  • 單個 Sitemap 文件最多包含 50000 條 URL;
  • 未压缩狀態下体积不超過 50MB;
  • 文件需要 UTF-8 编碼,压缩只能使用 gzip;
  • 索引文件本身同样受這两條上限约束,一個索引可以指向多個分片。

也就是说,URL 數量到十萬級时,靠一個文件已经不太可行;到百萬級时,索引下面還要再分层,或者按业務线拆成多個索引分別维護。

索引文件解决什么問题

索引文件本身不包含頁面地址,它只列出各個分片的位置。它的價值在于给蜘蛛一個稳定入口:只需抓取一個地址,就能顺着清單找到全部分片,而不必去猜你的 URL 規律。

實践中建议把索引放在站点根目錄下的固定路径,並在 robots.txt 中声明,避免每次改版都換地址。分片地址尽量寫成绝對 URL,且不要指向會跳轉的地址——多一跳就多一次消耗。

按什么维度拆分更合理

  • 按内容類型:文章、商品、栏目頁分開,各自的更新节奏不同,便于單獨维護。
  • 按更新時間:把近期更新的 URL 放一個分片,歷史 URL 放另一個,蜘蛛抓近期分片的收益更直接。
  • 按語言或地区:多語言站点按語言拆,避免一個分片里混着大量與目前站点無關的地址。
  • 按數量切齐:如果没有明顯的业務维度,就按 2 萬到 3 萬條一個分片切,留出增長余量,不要卡着 50000 條顶格。

拆分维度没有唯一答案,判断标准是:更新频率相近、生命周期相近的 URL 放在一起,维護时才不會互相拖累。

lastmod 別乱寫

lastmod 是蜘蛛判断分片是否需要重新抓取的參考之一。如果每次生成 Sitemap 都把全部條目的時間刷成当天,這個字段就失去了意义,時間久了蜘蛛也會逐渐忽略它。更稳妥的做法是让 lastmod 跟随内容真實的修改時間,只對确實變動過的 URL 更新。

分片的價值不在于“寫了多少條”,而在于清單是否干净、時間是否可信。

几個容易踩的坑

  • 分片里留着已经 404 或 301 的老地址,等于持續给蜘蛛制造無效抓取。
  • 分片文件本身返回 404 或 5xx,整個索引就失去作用,需要把分片当成正式頁面来监控。
  • 分片數量過多、每個分片只有几十條,會增加蜘蛛的抓取次數,收益却不高。
  • 只在提交时生成一次,之後長期不再更新,新增 URL 就進不了清單。

怎么確認分片被正常抓取

可以在服務器日誌里單獨筛出 Sitemap 相關請求,观察几個指标:分片是否被訪問、返回碼是否為 200、訪問频率是否稳定、新生成的分片是否在几天内被取走。如果某個分片長期無人訪問,優先检查它是否寫進了索引文件、地址是否可以直接打開。

分片和索引只是 URL 發現的一环,它需要和内鏈结构配合:Sitemap 负责把地址交给蜘蛛,内鏈负责告诉蜘蛛這些地址值不值得反复来。两者對不上时,通常先看 Sitemap 里是否混進了不该出現的地址。