Sitemap 是站点主動把 URL 清單交到蜘蛛面前的一條通道。頁面數量少的时候,一個 XML 文件就够了;当 URL 涨到几萬、几十萬條,單個文件容易撞上体积和條數上限,讀取中断、只讀到一部分的情况也會變多。這個阶段通常要把清單拆成多個分片,再用一個索引文件把它們串起来。
為什么需要索引文件
常见的约定是:單個 Sitemap 文件最多 5 萬條 URL,未压缩时不超過 50MB。把十几萬條 URL 塞進一個文件,既可能超出限制,也會让蜘蛛一次讀取的负担變重。索引文件本身不列具体 URL,只列各個分片的位置,蜘蛛顺着索引逐個取分片,某一片出错也不會连带整份清單。
索引文件的基本寫法
索引文件的根节点是 sitemapindex,里面每個 sitemap 节点包含一條 loc,指向一個分片文件的绝對地址,另外可以带 lastmod。
- loc 要用完整 URL,包含协议和域名,相對路径容易解析失敗。
- lastmod 寫分片内容真正更新的時間,不要每次生成都刷新成目前時間。
- 分片文件的地址尽量稳定,不要带随机參數或時間戳目錄。
- 索引文件本身也要能被訪問到,並在 robots.txt 里声明它的位置。
分片怎么切更省事
切分方式没有唯一答案,但一旦選定就尽量別频繁改動,否則蜘蛛刚记住一批地址,下一轮又全變了。
- 按内容類型切:文章、商品、栏目頁各自成片,出問题时容易定位。
- 按更新時間切:新内容單獨一片,老内容归档成片,方便观察新鲜内容的發現速度。
- 按目錄或频道切:和站内结构對應,分片命名一看就懂。
- 控制單片規模:不必卡到 5 萬上限,留出余量,單文件体积小一些讀取更稳。
分片常见的几個坑
- 返回 200 但内容是错誤頁或登入頁,蜘蛛拿到的是無效 XML。
- 分片地址改版後返回 404,索引里還留着舊地址,形成死鏈。
- gzip 压缩了文件,但响應头没标清楚,解析端可能直接报错。
- URL 中含未轉义的连接符,或中文未编碼,導致 XML 解析失敗。
- 索引文件只声明了部分分片,遗漏的目錄就少了這條發現通道。
- 同一批 URL 同时出現在多個分片里,浪費抓取又增加重复判断。
和站内連結、日誌一起看
Sitemap 解决的是清單問题,不解决可達性問题。蜘蛛拿到 URL 之後,還是要靠站内連結判断這個頁面在站里的位置和重要程度。所以分片做得再整齐,也不能替代正常的栏目頁、列表頁和正文互鏈。
排查时可以拿服務器日誌和分片清單對照:哪些分片被反复讀取,哪些從没出現過,哪些分片里的 URL 長期没有抓取记錄。這些差异比單看一份报表更有信息量。
Sitemap 是一份清單,不是排名工具。它能让蜘蛛更省力地知道有哪些 URL,但要不要抓、什么时候抓,仍由蜘蛛自己判断。
一個可以照着做的检查顺序
- 打開索引文件,確認每個分片地址都能正常返回 XML。
- 抽几個分片,检查條數、体积是否在合理范围。
- 核對 lastmod,是否和實际更新時間一致。
- 在 robots.txt 中確認 Sitemap 声明指向索引文件。
- 隔一段時間看日誌中分片的讀取情况,是否有長期未被訪問的分片。
把這些固定成上线前的检查項,分片數量增長时也不容易乱。清單交得清楚,蜘蛛的發現环节就少一個不确定因素,後面的抓取和索引才有讨论的基础。