頁面數量到几千、几萬以後,單個 XML 站点地图往往放不下,于是需要拆成多個分片,再用一個索引文件把它們串起来。問题也常出在這一步:分片本身没問题,索引文件的寫法或返回狀態有偏差,爬虫讀完索引却没有繼續讀分片,URL 發現就断在這里。
先確認什么时候需要拆
主流搜尋引擎對單個站点地图文件有大致相同的约束:未压缩文件通常不超過 50MB,單個文件包含的 URL 一般不超過 5 萬個。接近任一上限就该拆分。
- 頁面量在數千以内,單文件基本够用,拆開反而增加维護成本。
- 數量上萬,或單文件明顯變大(比如带了較長的 hreflang、图片、视频信息),建议按目錄或按頁型拆分。
- 拆分维度最好和站点结构一致,比如商品頁一片、文章頁一片、栏目頁一片,出問题时容易定位。
索引文件的寫法要点
索引文件的根节点是 sitemapindex,每個子項里只放 loc(分片地址)和可選的 lastmod,不要出現頁面級的 url 节点,也不要寫 priority、changefreq 這類只属于頁面級站点地图的字段。
- loc 必须是完整的绝對地址,包含协议和域名,不要用相對路径或 ../ 形式。
- 分片地址要能直接返回 200,中間不要经過 302 跳轉、登入校驗或地域拦截。
- 命名空間要和根节点匹配,複製模板时改错命名空間是常见原因。
- 不要自我引用,索引文件里不要再把索引文件自己列進去。
- lastmod 用统一的日期格式,不要同一批分片全部寫成同一個時間点,也不要用未来時間。
分片文件本身的几個坑
- 压缩後的 .gz 文件,後缀、压缩方式和响應头里的 Content-Type 要對應,解压失敗等于没有内容。
- 分片里的 URL 要和頁面上 canonical 指向的地址一致,否則相当于给爬虫提供了两套入口。
- 單個分片不要超過 5 萬條或 50MB,超限时通常整份被忽略,而不是只丢掉多出来的部分。
- 分片地址變更後,舊地址最好保留一段時間並返回 200 或 301,避免索引里残留失效路径。
怎么驗證分片到底有没有被讀到
索引文件被請求,不代表分片被請求。可以按下面几步核對:
- 在服務器日誌里篩選爬虫 UA,看它請求了哪些 sitemap 路径、狀態碼分別是多少。只有索引文件被訪問、分片一條日誌都没有,基本可以判断卡在索引层。
- 看搜尋资源平台里的站点地图报告,提交的分片是否顯示為已處理,有多少 URL 被發現。
- 用相同的 UA 模拟請求分片地址,確認返回的是 XML,而不是首頁 HTML、驗證頁或空内容。
- 對比分片里的 URL 數量和报告里發現的數量,差距過大时回到前两步繼續查。
站点地图只是發現渠道之一
站点地图的作用是告诉爬虫這里有這些 URL,它不负责保證被抓取,更不保證被收錄。發現之後還要经過抓取、解析、质量判断几個环节。
- 内鏈是最稳定的發現渠道,重要頁面應该能從首頁通過几次点击到達,不要只依赖站点地图。
- 外部連結能带来發現,但新頁面數量少、到達慢,适合作為补充。
- 如果用蜘蛛池之類手段提高抓取频次,要注意它影响的只是抓取請求量,對 URL 能否進入索引作用有限,頁面质量、重复度和站点结构才是决定性的。
上线前可以照着走的自查清單
- 索引文件能被直接訪問,返回 200 和 XML 内容。
- 每個分片地址都返回 200,内容可以正常解析。
- 分片數量與頁面分组數量一致,没有漏掉某一類頁型。
- 分片里的 URL 與 canonical、内鏈指向保持一致。
- 站点地图入口已寫進 robots.txt,並在搜尋资源平台提交。
- 上线後一周内看一次日誌,確認分片确實被抓取過。
站点地图是辅助工具,不是收錄開關。把它寫對、驗對,能让 URL 更容易被發現;發現之後能不能進入索引,還是要回到頁面本身的质量和站点结构上。