站点小的时候,一個 Sitemap 就够了。等 URL 涨到几萬條,往往會撞上一個硬邊界:單個 Sitemap 文件最多 5 萬條 URL、未压缩体积不超過 50MB。超出的部分不會被讀取,于是多出来的頁面等于没交出去。這时候要做两件事:把 URL 拆成分片,再用索引文件把分片串起来。
分片和索引各管什么
分片文件(子 Sitemap)里放的是頁面 URL 本身,一條一條列。索引文件(sitemap index)里放的是分片文件的地址,不出現任何頁面 URL。蜘蛛先讀索引,再按索引里的地址逐個去讀分片。层級只有這两层,索引下面不能再套索引。
怎么切分片
- 按目錄切:/product/、/article/、/tag/ 各一個文件,出错时容易定位。
- 按内容類型切:文章、商品、問答各一份,更新频率不同,lastmod 也更好给。
- 按更新時間切:新闻類站点可以按月或按周切,老内容分片基本不變。
- 每片控制條數:不必都塞到 5 萬條。几千到一两萬條一片,讀取失敗时影响面更小。
拆分本身不影响抓取,但切得清楚,後面排查問题时省事。
索引文件里最容易寫错的几處
- 把頁面 URL 混進索引。索引里只認分片地址,混入頁面地址等于白寫。
- 协议或域名不统一。索引里寫 https,分片里寫 http,或者 www 與非 www 混用,蜘蛛會当成两套地址。
- gzip 分片没标對。压缩後的文件一般以 .xml.gz 结尾,同时要让服務器正确返回该文件的類型,否則可能被当成下载内容。
- 分片地址返回 404 或 301。索引指向的地址應当是可直接訪問的最终地址,不要让它再跳一次。
- lastmod 全站同一個時間。所有分片都标同一個時間戳,參考價值會打折;分批给、和實际更新對齐更實在。
哪些 URL 不该出現在分片里
分片是一份希望被看到的清單,不是全站地址導出。以下几類放進去意义不大,還會稀释清單本身的信号:
- 返回 301/302 的舊地址,最终地址另有一份。
- 已经 404、410 的死鏈。
- 带 noindex 的頁面,或 robots.txt 里被拦住的路径。
- 大量參數组合、篩選结果頁,除非這些頁面确實需要被單獨抓取。
- 同一内容的不同 URL 變体,除非你能确定哪一個是規范版本。
分片之外,蜘蛛還得有路可走
提交分片只是把地址递過去,不等于蜘蛛會挨個訪問,也不等于頁面會被收錄。分片解决的是你知不知道這些 URL,内鏈解决的是這些 URL 在站内處于什么位置。一個頁面在分片里、在站内却没有任何入口,長期看仍然容易被冷落。
分片是清單,内鏈是路径。清單可以很長,路径必须真實存在。
交付之後怎么確認有没有被讀到
- 在服務器日誌里筛分片文件的訪問记錄,看蜘蛛是否按索引顺序讀過。
- 观察分片是否被频繁重复讀取;如果某個分片長期無人訪問,检查它是否還在索引里、地址是否可達。
- 分片更新後不必立刻重寫全部文件,只改變動的部分,减少無意义的重复讀取。
- 索引文件本身保持稳定地址,不要每次改動都換路径。
站点規模再大,Sitemap 也只是一條辅助發現路径。它的價值在于把散落的 URL 集中起来,让蜘蛛少走弯路;至于抓不抓、抓多少,仍然取决于站点结构、响應速度和内容更新节奏。分片做得規范,至少能让這份清單不被浪費。