搜尋抓取

canonical 與蜘蛛抓取:重复 URL 會不會白耗抓取配額

同一個頁面常常存在多個可訪問地址,带參數、带斜杠、大小寫不同都可能被蜘蛛当成獨立 URL 反复抓取。本文讲清 canonical、301 和 robots.txt 在處理重复 URL 时的力度差异,以及寫法里常见的坑,帮助站点把有限抓取留给真正需要的地址。

搜尋抓取

canonical 與蜘蛛抓取:重复 URL 會不會白耗抓取配額

同一個頁面,蜘蛛可能看到好几個地址:带 www 和不带、结尾有没有斜杠、參數顺序不同、路径大小寫不一样,再加上各種追踪參數和會话 ID。這些地址如果都返回 200,蜘蛛通常會把它們当作彼此獨立的 URL 分別抓取。canonical 的作用就是告诉蜘蛛哪個才是要留下的那一個,但它只是提示,不是命令。

重复 URL 是怎么多出来的

大多數站点的重复地址並不是刻意造出来的,而是几類常见来源叠加的结果:

  • 协议與主机名變体:http 與 https、带 www 與不带 www 同时可訪問。
  • 路径细节:结尾斜杠有無、大小寫混用、URL 末尾多出 index.html。
  • 參數排列:同一组篩選參數換顺序、自動附加的 utm 追踪參數、會话 ID。
  • 功能頁副本:打印版、分享版、排序方式、每頁條數切換。

這些地址往往内容几乎一致,但蜘蛛要分別請求、分別下载、分別解析。數量一多,抓取配額就被摊薄了。

三種處理方式,力度並不一样

301 永久重定向

力度最强,蜘蛛看到 301 後一般會把舊地址的權重和抓取信号轉移到新地址,並在後續抓取中直接使用新地址。适合协议、主机名、大小寫、结尾斜杠這類有唯一正确答案的變体。代價是每多一跳就多一次請求,所以尽量不要串成多級跳轉。

canonical 标簽

力度中等,是建议而非指令。蜘蛛仍會抓取带 canonical 的頁面,只是倾向于把信号归到目标 URL 上。它适合内容确實重复、但两個地址都有存在理由的情况,比如同一商品的不同篩選视图、有多語言版本的頁面。canonical 寫成相對路径、寫成带參數的地址、指向一個 404 或重定向目标,都是常见错誤。

robots.txt 屏蔽

力度看似最强,實际上限制的是抓取而不是索引。被屏蔽的 URL 蜘蛛抓不到,也就讀不到上面的 canonical,外部連結指向它时反而可能造成困惑。一般不建议用 robots.txt 去處理重复内容,更适合處理确實没必要抓取的目錄。

寫法上容易踩的坑

  • canonical 與内鏈不一致:頁面 canonical 指向 A,站内連結却大量指向 B,两個信号互相打岔。内鏈最好统一用規范形式。
  • 分頁頁面全部 canonical 到第一頁:這會让後續頁面的内容信号向第一頁集中,翻頁路径的抓取也可能變少。分頁一般让每頁 canonical 自身更稳妥。
  • Sitemap 里混入非規范地址:Sitemap 是主動提交抓取入口的地方,里面出現带參數的重复 URL,等于自己把重复地址再报一遍。
  • canonical 指向被 noindex 的頁面:两個信号冲突,蜘蛛需要自行判断,结果往往不如预期。
  • 只寫 canonical,不做服務端跳轉:能跳的重复地址尽量在服務端跳掉,剩下的再交给 canonical,比全压在标簽上更干净。

配套要做的几件事

  • 在服務器层面對大小寫、结尾斜杠、主机名做统一跳轉,規則越简單越好。
  • 篩選、排序參數如果内容差异不大,可在服務端直接輸出規范頁,避免為每種參數组合生成獨立 URL。
  • 外鏈和站内連結尽量只使用一種形式的地址,减少被動产生的變体。
  • 定期翻看服務器日誌,看蜘蛛抓取的 URL 中有多大比例属于重复變体。這個比例比抓取總量更有參考價值。
canonical 不是把重复 URL 變没,而是把散落的抓取信号收拢到一個地址上。真正减少浪費的,還是服務端跳轉、统一内鏈和干净的 Sitemap。

最後提醒一点:重复 URL 的處理效果需要一段時間才能從日誌里看出来,改完之後不必天天盯着抓取曲线。把入口理干净,让蜘蛛少走几條弯路,已经是有意义的優化。