搜尋抓取

Sitemap 索引與分片:几萬條 URL 的清單该怎么组织

單個 Sitemap 文件有 5 萬條 URL 和 50MB 两條上限,超了可能整份失效。本文讲索引文件與子清單怎么拆分、lastmod 怎么寫才可信、哪些 URL 不该放進清單,以及清單文件自己响應不稳定时,對 URL 發現的影响。

搜尋抓取

Sitemap 索引與分片:几萬條 URL 的清單该怎么组织

站点大到一定程度,把所有 URL 塞進一個 Sitemap 文件,問题往往不是蜘蛛看不看,而是文件本身难维護、难定位,出了問题也不知道是哪一類頁面受影响。把清單拆成索引加多個子文件,是 URL 發現這條鏈路上比較實用的一步。

為什么要拆:先看两條硬上限

單個 Sitemap 文件有明确的邊界,越過之後不是抓得慢一点,而是文件可能被判為無效,里面的 URL 一條都進不了發現队列。

  • 單個文件最多 50,000 條 URL。
  • 未压缩体积不超過 50MB,用 gzip 上传时,判断标准仍是解压後的大小。
  • 索引文件本身最多指向 50,000 個子 Sitemap。

按什么维度分片

常见的做法是让每個子文件對應一類邊界清晰的内容,出問题时能快速定位范围。

  • 按内容類型:文章、商品、分類、专题各一份,便于對照日誌判断哪一類没被取走。
  • 按語言或地区:多語言站点分開,與各自的目錄结构對應起来。
  • 按更新频率:更新频繁的放一份,長期不變的归档内容放另一份,减少整份文件的重复抓取压力。

分片粒度不必太细。几十個子文件通常够用,拆成几百個反而增加蜘蛛讀取索引文件的次數。

索引文件怎么寫、放在哪

索引文件用 sitemapindex 结构,每一項指向子 Sitemap 的完整绝對地址,且應與索引文件同域。robots.txt 里一般只声明索引文件這一條,蜘蛛會顺着它去取各個子文件。

清單寫得再全,也只是告诉蜘蛛這里存在一個地址;是否抓取、什么时候抓取,仍由蜘蛛自己判断。

lastmod:寫真的,別批量刷

lastmod 是清單里少數會被參考的字段,但前提是它可信。

  • 只寫内容發生實质變化的日期,改错別字、換广告位不算。
  • 用带时区的 ISO 8601 格式,例如 2024-05-20T08:30:00+08:00,避免按 UTC 誤判。
  • 全站批量刷新 lastmod,短期可能带来回爬,長期會让這個字段失去參考價值。
  • changefreq 與 priority 目前基本被忽略,不必在這两個字段上花太多精力。

清單里该放哪些 URL

  1. 只放返回 200 且允许被索引的規范地址。
  2. 不放 301、302 跳轉地址,也不放 noindex 頁面和 404 頁面。
  3. 與頁面 canonical 保持一致,避免清單里一個地址、頁面里指向另一個地址。
  4. 篩選、排序等參數頁預設不放,除非它确實有獨立内容和搜尋需求。
  5. 分頁的後續頁可以放,但不比内容頁更重要,數量大时要有取舍。

清單文件自己也要能稳定返回

很多站点把清單当成静態资源随手一放,结果所在目錄响應慢、偶發 5xx,或者被 WAF 誤拦。清單取不到,後面所有 URL 都無從發現。几個基本要求:

  • 响應稳定,尽量走缓存或 CDN,降低回源压力。
  • 不要用多跳重定向引導到清單文件,多余的跳轉會拖慢處理。
  • 压缩上传没問题,但解压後要能被正常解析,不出現编碼错誤。
  • 更新频繁的子清單可以设較短缓存,归档類清單设較長缓存。

怎么確認清單真的起了作用

可以按三步检查:一是看搜尋後台的 Sitemap 报告,確認文件被讀取、解析成功的 URL 數量是否符合预期;二是翻服務器日誌,看蜘蛛是否按索引文件逐條請求子清單,請求频率和狀態碼是否正常;三是抽样抓取清單里的若干 URL,核對狀態碼、canonical 與清單记錄是否一致。三者對不上时,先排查清單本身,再排查頁面。

Sitemap 是 URL 發現的辅助通道,不是抓取配額。把它组织清楚、保持字段可信,比反复提交、频繁改動格式更有效。