同一個商品頁,加上排序參數、篩選參數、追踪參數之後,可以變成几十個甚至上百個不同地址。這些地址都返回 200,内容大同小异,蜘蛛會沿着這些連結一路抓下去。结果是抓取预算被摊薄,真正需要更新的頁面反而回訪變慢。這篇文章讲的是參數地址怎么收口,以及收口时容易踩的坑。
參數為什么會让一個頁面變成多個地址
對服務器来说,查询字符串不同就是不同請求。只要程序没有做归一化處理,每個參數组合都會生成一份獨立的响應。蜘蛛没有“這两個地址其實是同一個頁面”的判断能力,它只看到两個返回 200 的 URL,並且都能從站内連結点進去。
更麻烦的是參數可以互相组合。三個篩選维度各有两個取值,就是 2×2×2 共八種组合,再加上排序方向、每頁數量、追踪标记,數量很快就失控。這些頁面本身不算错,問题在于它們都參與抓取,却几乎不带来新的可索引内容。
先分清參數的性质
- 會改變内容核心的:比如商品規格、文章分頁,這類地址是真實存在的不同頁面。
- 只改變呈現顺序的:排序、视图切換,内容集合相同,只是排列不同。
- 纯篩選的:颜色、尺寸、價格区間,介于前两者之間,取值少时有價值,取值多时容易散。
- 追踪性质的:utm、来源标记、會话 ID,對内容没有任何影响,属于必须處理的一類。
分類的意义在于决定收口力度:追踪參數應当直接拦掉,排序參數适合做規范化,篩選參數需要按组合數量设個上限。
收口的几種做法
canonical 是最直接的一层
在頁面头部指向不带參數的版本,等于告诉蜘蛛“這些變体請归到一個地址上”。它不阻止抓取,但能减少重复内容带来的不确定性。注意 canonical 要指向真實存在、能正常打開的 URL,如果指向一個重定向地址或者被 robots 挡住的地址,信号會打折。
robots.txt 與參數規則
有些搜尋引擎支持在 robots.txt 里寫參數處理規則,明确哪些參數可以忽略。但這不是所有爬虫都遵守的通用标准,寫之前要看清楚支持范围。挡掉之後頁面也就無法被抓取,如果這個參數组合未来可能成為有效落地頁,就需要谨慎。
從連結源头减少暴露
比事後收口更省事的,是不生成這些連結。排序、篩選用表單提交或者按钮交互,連結本身指向不带參數的地址,蜘蛛就不會顺着這些地址爬散。但也要注意,如果這些内容對用戶有價值,完全隐藏會影响它被發現的可能,需要在两端權衡。
Sitemap 里只放主版本
Sitemap 是主動推荐的通道,把带參數的變体塞進去,等于自己把抓取方向引向重复内容。只提交規范版本,让 Sitemap 和 canonical 说的是同一件事。
分面篩選頁的邊界
分面導航是最容易撑開抓取路径的地方。常见的處理方式有几種:限制可抓取的參數组合數量,超出范围的组合返回 404 或者加上 noindex;把多层篩選改成單层;對篩選结果頁不做站内連結或者只保留少量入口。關键是一致:如果某個组合你在 Sitemap 里提交了,又在頁面里 noindex,两邊说法打架,效果就會互相抵消。
收口的目标不是让參數頁全部消失,而是让蜘蛛把時間花在真正需要更新的 URL 上。判断标准可以简單一点:這個參數组合,有没有用戶會從搜尋结果点進来,並且看到不一样的内容。
怎么確認收口生效了
- 抓取日誌里带參數的請求占比有没有下降,下降之後主版本的抓取次數有没有上升。
- 抽查几個變体地址,看返回的狀態碼、canonical 指向是否和预期一致。
- 观察一段時間内被選擇的版本是否稳定,如果今天選 A 明天選 B,說明信号還不够清楚。
- 检查内鏈和 Sitemap 是否還在大量輸出參數地址,源头没改,收口效果會被抵消。
參數問题很少能一次改完,通常要按類型分批處理,改完观察一段時間再决定下一步。先處理追踪參數這類最容易判断的,再處理篩選组合,改動幅度小一点,也更容易看出哪一步起了作用。