搜尋抓取

Sitemap 分片與索引:URL 規模上来之後,清單该怎么组织

站点 URL 到几萬條以後,單個 Sitemap 文件装不下,拆分方式會直接影响蜘蛛讀取這份清單的效率。這篇讲分片與索引文件的组织思路、哪些 URL 该放進去、哪些不该,以及提交之後可以看哪些資料来判断發現通道是否顺畅。

搜尋抓取

Sitemap 分片與索引:URL 規模上来之後,清單该怎么组织

Sitemap 是站点主動交给搜尋蜘蛛的一份 URL 清單。頁面不多时,一個文件就能覆盖;当站内 URL 涨到几萬、几十萬條,單文件必然装不下,這时怎么拆、怎么用索引文件串起来,會直接影响蜘蛛讀這份清單的效率和完整度。

先確認几個硬上限

各搜尋平台的規則略有差异,但大方向一致:

  • 單個 Sitemap 文件能放的 URL 數量有上限,未压缩体积也有上限。
  • 超出上限就得拆成多個子文件,再用一個 Sitemap 索引文件把它們列出来。
  • 索引文件本身同样受數量和体积约束,子文件特別多时要再分一层。
  • 開啟压缩能明顯减小传輸体积,但响應头與文件名要寫對,別让蜘蛛下载到一個打不開的文件。

具体數字以各家官方文档為准。运营上更值得關注的是:每個文件是不是都能正常打開、返回的狀態碼是不是 200、内容是不是合法的 XML。

按什么维度拆分更顺手

按内容板块拆

商品、文章、分類、标簽各给一個子文件,好處是出問题时定位快。某一類 URL 突然出現大批量抓取異常,看一眼對應的子文件就能把范围缩小。

按更新节奏或 URL 段拆

把高频更新的内容單獨放一個子文件,低频的放另一個。這样观察新增 URL 的發現速度时,資料會更干净,不會因為新老内容混在一起而看不出變化。

不建议按 URL 參數或查询串去拆,那類地址本身就该收口,放進 Sitemap 只會把噪音一並递出去。

哪些 URL 不该出現在清單里

  • 會跳轉的地址,也就是 301、302 的源 URL,直接寫最终地址。
  • 返回 404、410 的失效頁面。
  • 已经设了 noindex 的頁面。
  • 被 robots.txt 屏蔽、蜘蛛本来就不能抓的 URL。
  • 同一内容有多套地址时,只留 canonical 指向的那一個。

把不该出現的地址放進 Sitemap,等于给蜘蛛派了一批注定失敗的任務,消耗的是抓取時間和服務器资源。

Sitemap 不能替代内鏈

Sitemap 解决的是“蜘蛛知道有這個地址”,但它不负责告诉蜘蛛這個頁面在站内有多重要、從哪條路径能走到。一個只出現在 Sitemap、站内没有任何入口連結的頁面,仍然容易變成孤岛。

把 Sitemap 当作發現通道,把内鏈和導航当作抓取主干道,两者各司其职,別指望其中一方包办。

新頁面上线时,比較稳妥的做法是同时在两個地方露出:站内给它一個自然的入口連結,Sitemap 里同步更新。只做前者,蜘蛛可能晚几天才發現;只做後者,它進来了也未必會認真走。

提交之後该观察什么

  • 後台的 Sitemap 相關报告:文件是否讀取成功、识別到多少 URL。
  • 服務器日誌:Sitemap 文件本身的訪問是否频繁报错或超时。
  • 子文件里的 URL 被實际訪問過的比例,用来判断發現通道是否顺畅。
  • 新增 URL 從上线到第一次被抓的時間,作為發現速度的參考。

Sitemap 更新後不需要反复重新提交,让文件内容保持實时准确,比多按几次提交按钮更重要。

几個反复出現的坑

  • Sitemap 文件本身被 robots.txt 挡住,或者放在需要登入才能訪問的目錄里。
  • 子文件里長期混着已刪除、已改版的舊 URL,没人清理。
  • 索引文件引用的子文件用了错誤域名,www 和非 www 混着寫。
  • 体积靠压缩達标了,但解压後仍然超限,蜘蛛讀到一半就停。

這些問题的共同点是:不影响頁面本身,只影响蜘蛛拿到清單的效率,所以平时不容易被發現,往往要翻日誌才看得出来。定期抽查一次文件狀態和日誌里的讀取记錄,比事後排查省事得多。