搜尋抓取

Sitemap 索引與分片:大站把抓取地图拆開後要注意什么

当站点 URL 數量上到几萬條,單個 sitemap 文件會先撞上條數與体积上限,再拖慢蜘蛛的讀取效率。本文說明 sitemap index 的作用、按栏目或時間拆片的思路、lastmod 该标在哪一层、分片地址的可抓取要求,以及如何用服務器日誌判断拆片是不是真的被蜘蛛讀到了。

搜尋抓取

Sitemap 索引與分片:大站把抓取地图拆開後要注意什么

Sitemap 不是提交一次就完事的文件。当站点 URL 數量涨到几萬甚至几十萬,單個 sitemap 會先撞上协议里的硬性上限,再影响蜘蛛讀取這份清單的效率。這时通常需要用到 sitemap index(索引文件)加分片的组织方式。

先看硬性上限:單文件装不下大站

协议给的范围很明确:一個 sitemap 文件最多 50000 條 URL,未压缩体积不超過 50MB。超過就得拆。但很多站点真正的問题不是超限,而是把几萬條 URL 塞在一個文件里——蜘蛛每次来都要完整取一遍,頁面只改動一点点,整份文件的更新時間也跟着變。

索引文件只做一件事:指向分片

sitemap index 里不寫具体 URL,只寫各個子 sitemap 的地址和 lastmod。结构大致包含根节点 sitemapindex,下面每條记錄對應一個 loc 與一個 lastmod。需要注意的是,索引里不能再套索引,子 sitemap 必须是普通 sitemap,不能又是 index 文件。

按什么维度拆片

  • 按栏目拆:内容類型差別大时最清晰,某個栏目更新频繁,只影响它那一片。
  • 按時間拆:适合更新节奏快的站点,例如新闻按月分片,舊片内容基本不變。
  • 按内容類型拆:文章、商品、标簽頁分開,便于單獨观察各類型的抓取表現。

每片的 URL 數量建议留出余量,不要顶到 50000,几萬條以内更容易被完整讀取。片數也不宜過多,几十片通常就够用,拆得太碎反而增加蜘蛛的請求次數。

lastmod 要标到分片這一层

索引里的 lastmod 是告诉蜘蛛這组 URL 有没有整体變化的關键信号。如果分片内容没變却一直刷新時間戳,蜘蛛會逐渐不再信任這個字段;反過来,某片新增了内容却没有更新 lastmod,可能過很久才會被重新讀取。子 sitemap 内部的 lastmod 與索引层的 lastmod 最好保持一致逻辑。

分片地址必须自己能被抓到

  • robots.txt 里不要拦掉 sitemap 所在目錄。
  • 分片地址返回 200,内容類型為 XML,不要被重定向到別的路径。
  • 不要在分片里塞入被 robots 禁止抓取的 URL 或已经下线的頁面。
  • 分片里的 URL 尽量與站内連結可達的地址一致,避免地图和内鏈互相矛盾。

怎么驗證拆片有没有生效

更實用的做法是看服務器日誌:索引文件被請求的频率、返回狀態碼、蜘蛛取完分片後是否繼續抓取其中的 URL。如果索引被频繁抓取,但子分片很少被請求,問题多半出在索引里的 lastmod 或分片地址本身。如果分片被正常讀取,其中的新 URL 却迟迟没有進入抓取队列,就该回到内鏈和頁面本身找原因,而不是繼續加 sitemap 條目。

Sitemap 负责告诉蜘蛛這里有什么,内鏈负责證明這些 URL 值得抓。两者缺一,拆得再细的地图也只是一份清單。