搜尋抓取

Sitemap 分片與索引文件:把 URL 清單准确交给蜘蛛

Sitemap 解决的是 URL 發現,而不是收錄。單文件有 50000 條與 50MB 的限制,超過就要拆分並用索引文件串联。拆分的粒度怎么定、lastmod 怎么寫才不算噪声、哪些地址不该出現,以及提交之後如何用日誌確認蜘蛛真的按清單走,都會影响這份清單的實际價值。

搜尋抓取

Sitemap 分片與索引文件:把 URL 清單准确交给蜘蛛

Sitemap 的作用邊界

Sitemap 解决的是“發現”問题,不是“收錄”問题。它告诉蜘蛛這里有這些 URL,但抓不抓、什么时候抓、抓完是否收錄,取决于内容质量、服務器响應和頁面本身是否可抓取。所以不要把 Sitemap 当成收錄開關,它的實际價值在于让新 URL 更快進入待抓队列,让老 URL 的更新信号更明确。

單文件的两個硬限制

通用規范里,單個 Sitemap 文件有两個限制:URL 條數不超過 50000 條,未压缩体积不超過 50MB。實际使用建议留出余量,比如控制在 30000 條以内,因為生成和传輸過程中的開销常让實际体积超出预期。

超過限制就必须拆分。拆分的依據不要只按數量平均切,更合理的是按目錄或内容類型切:文章、商品、标簽、专题各一個文件。這样出問题时能單獨定位,更新频率不同的内容也不會互相拖累。

索引文件怎么串联子文件

拆分後需要一個索引文件把子文件列出来,索引文件本身同样受 50000 條和 50MB 的限制。索引里每條记錄包含 loc 和可選的 lastmod,loc 必须是完整的绝對地址,並且與子文件真實地址完全一致,大小寫、结尾斜杠都要對得上,否則蜘蛛取不到内容。

索引地址可以在 robots.txt 里声明,也可以提交到站長平台,两者不冲突。但不要今天提交這個地址、明天換成另一個,让蜘蛛在两個入口之間反复確認,白白消耗抓取次數。

lastmod 怎么寫才不算噪声

lastmod 是抓取調度中少數能直接被利用的時間信号,但滥用會失效。常见的問题有:

  • 每次生成 Sitemap 时把全站 lastmod 刷成目前時間,蜘蛛會認為所有頁面都在频繁更新,最终忽略這個字段;
  • 内容没變,只因模板或样式的改動更新了時間戳;
  • 時間格式不统一,有的寫日期,有的寫带时区的時間戳。

比較稳妥的做法是:只在正文發生實质變化时更新 lastmod,格式统一用带时区的 ISO 8601。如果做不到准确,宁可不寫,也不要寫一個假的。

容易被忽略的几類错誤

  • 把 robots.txt 里已被拦截的 URL 放進 Sitemap,蜘蛛讀到也會跳過,等于浪費一次抓取;
  • Sitemap 里混入 404 或 301 的舊地址,尤其是改版後没清理干净的歷史路径;
  • URL 带上會话 ID、排序參數等無意义變体,等于自己制造重复内容;
  • Sitemap 動態生成时讀取全站資料,接口超时返回空文件,蜘蛛拿到 200 但内容是空的;
  • 压缩格式與地址声明不一致,比如文件是 gzip 压缩,但地址结尾寫成 .xml。

提交之後要驗證什么

提交只是開始。接下来看日誌:Sitemap 文件本身有没有被稳定抓取,返回碼是不是 200,蜘蛛是否顺着清單去抓了里面的 URL。如果 Sitemap 被频繁抓取,但里面的新 URL 迟迟没有動静,問题通常不在 Sitemap 本身,而在于站点整体抓取预算被低價值頁面占满,或者内鏈没有把入口留给新頁面。

把 Sitemap 当成一份需要持續维護的“待處理清單”,而不是一次性提交完就不用管的任務。

和内鏈的分工

Sitemap 负责广度,内鏈负责深度和優先級。一個頁面如果只出現在 Sitemap 里、站内没有任何連結指向它,蜘蛛抓取後很难判断它處在什么位置,回訪频率也會被压低。比較稳的组合是:新内容發布後既有内鏈入口,比如列表頁、相關推荐、频道頁,也在 Sitemap 里出現,两條路径互相印證。

至于分頁、篩選參數這類頁面,一般不建议放進 Sitemap,让它們靠内鏈自然被發現即可,避免把有限的抓取次數花在内容高度重复的路径上。