在抓取日誌里经常會看到一種情况:同一篇文章,蜘蛛用七八個不同的地址訪問過。标题、正文、图片都一样,只有 URL 不同,于是每一次訪問都要重新下载、重新解析、重新判断。URL 變体不會立刻让頁面出問题,但它會持續消耗抓取額度,也让“蜘蛛到底發現了哪些 URL”這件事變得难以判断。
同一個頁面為什么會變成多個地址
大部分變体不是蜘蛛造出来的,而是站点自己提供的。常见来源有几類:
- 形式差异:结尾有没有斜杠、路径大小寫、http 與 https、带不带 www,這几種寫法如果都能返回 200,就是四個獨立地址。
- 參數差异:參數顺序不同、多余的空參數、預設值參數,都會让同一個列表頁生成多個 URL。
- 跟踪參數:分享、投放、統計工具自動附加的參數,如果内鏈里也带着,蜘蛛會顺着它們一路抓過去。
- 篩選項與排序:颜色、價格、排序方式组合起来,很容易把一個分類頁翻成几十個地址。
- 會话與临时 ID:部分老系統會把 sessionid 寫進 URL,同一用戶每次訪問地址都不同。
這些地址如果都返回正常内容,蜘蛛没有理由拒绝其中之一,只能逐個抓取。
變体地址带来的三层影响
抓取額度被摊薄
搜尋引擎给每個站点的抓取量,大致與站点規模、更新频率、响應速度相關。当同一份内容占用多個 URL 时,真正的新頁面分到的次數就會减少。表現是舊内容反复被抓,新發布的頁面却迟迟不来。
内鏈指向不统一
導航里寫带斜杠的版本,正文里寫不带斜杠的版本,分享按钮又生成带參數的版本。蜘蛛沿着不同的内鏈走到同一個頁面,會把這些都记成獨立的發現路径,連結信号也随之被拆散。發現路径越多,真正需要注意的新 URL 反而越容易被淹没。
日誌與資料失真
統計“今天蜘蛛抓了多少頁面”,如果不先去重,得到的是變体數量而不是内容數量。判断抓取是否異常、某個栏目是否被冷落,都會因此得出错誤结论。
把變体收敛成一條地址
- 先定規范形態:明确使用 https、是否带 www、路径是否带结尾斜杠、保留哪些參數,寫進開發規范,新頁面直接按規范生成。
- 让舊地址 301 過去:形式差异的變体用永久重定向指向規范 URL,不要用 302,也不要让两個地址長期同时返回 200。
- 修正内鏈:導航、面包屑、正文、頁脚、分頁連結统一使用規范寫法;分享和統計參數交给前端處理,不要出現在 a 标簽的 href 里。
- 頁面自带 canonical:在 head 中指向規范 URL,作為兜底信号;但 canonical 不等于重定向,能改連結的仍然優先改連結。
- Sitemap 只放規范地址:抓取入口里混入變体,等于主動把蜘蛛引向重复内容。
- 谨慎處理參數:确實没有内容價值的參數可以用 robots.txt 屏蔽或參數工具處理,但屏蔽前要確認它不會连带挡掉正常頁面。
怎么確認收敛是否生效
比較實际的做法是定期把抓取日誌按“内容”而不是按 URL 聚合,看同一份内容被訪問的次數是否下降;再看一段時間内新增 URL 的抓取比例是否上升。如果變体訪問量下降、新頁面被抓得更快,說明收敛起了作用。
URL 變体不是致命問题,但它會让抓取预算和發現路径都變得模糊。先把同一份内容收敛成一個地址,再谈怎样让蜘蛛發現更多新 URL,顺序會更顺。
小结:URL 規范化的收益不會立刻顯現,它更像是在给後續所有抓取工作腾出空間。地址收敛之後,内鏈、Sitemap、日誌分析才有一個稳定的基础。