搜尋抓取

canonical 之外:重复 URL 為什么還在被蜘蛛抓

不少站点已经给重复地址加了 canonical,日誌里却仍能看到大寫地址、參數頁、舊域名被反复抓取。抓取發生在合並之前,canonical 只能减少索引混乱,挡不住請求。本文拆解重复 URL 的常见来源,並给出從内鏈、Sitemap、301 到 robots.txt 的收口顺序。

搜尋抓取

canonical 之外:重复 URL 為什么還在被蜘蛛抓

站点做了 canonical,日誌里還是能看到带參數的地址、大寫地址、舊域名被反复抓取。這通常不是蜘蛛没看懂标簽,而是抓取和索引本来就不是同一件事:只要一個 URL 被連結、被 Sitemap 列出、被歷史记錄记住,它就有机會進入抓取队列,canonical 一般在這一步之後才起作用。

重复 URL 一般從哪几個口子冒出来

先把来源分清楚,比一上来就加标簽更有效。

  • 參數:排序、篩選、追踪用的 utm、會话 ID、分頁參數。
  • 同一地址的不同寫法:大小寫、结尾斜杠、預設端口、www 與非 www。
  • 内容副本:打印頁、移動版、AMP、舊域名、http 與 https。
  • 程序生成:站内搜尋结果頁、标簽聚合頁、日歷頁。

這些 URL 有的是被内鏈带出来的,有的是外鏈残留,有的干脆来自 Sitemap 自己寫错。

canonical 管的是合並,不是拦截

canonical 告诉蜘蛛“這一组里以哪個為准”,但它不阻止抓取。蜘蛛發現 URL、抓取、渲染,再判断是否需要合並,顺序上抓取在前。也就是说:重复 URL 被大量抓取时,真正被消耗的是抓取预算和服務器资源,canonical 只能减少後續的索引混乱,减不掉前面的請求數。

另一個容易忽略的点是:被抓不等于被索引,但“未被索引的抓取”依然占用带宽、CPU 和蜘蛛的時間片。對中小站点来说,這部分浪費往往比想象中大。

收口要從“少被發現”開始

减少重复 URL 被抓,重点是管住它們的發現路径,而不是事後贴标簽。

  • 内鏈统一指向規范版本:導航、面包屑、列表頁、正文連結都指向同一種寫法。
  • Sitemap 只放規范 URL:Sitemap 是主動提交入口,寫错等于邀請蜘蛛来抓重复地址。
  • 能 301 的就 301:真正的舊地址、多域名、http 到 https,用跳轉比 canonical 更直接。
  • robots.txt 留给無價值參數:如站内搜尋、會话參數。注意被屏蔽的頁面無法再通過 canonical 传递信号,只适合确實不需要參與索引的地址。
  • hreflang 與 canonical 保持一致:多語言站点里两個标注指向不同 URL,最容易让蜘蛛来回抓。

有一種情况值得單獨提:站内搜尋頁和带排序參數的列表頁。它們内容随查询變化,蜘蛛很容易顺着一個輸入框或一個排序連結進入數量近乎無限的 URL。這類地址除了在 robots.txt 里屏蔽參數目錄,頁面上的入口也尽量改成表單提交或按钮,而不是可爬取的 a 标簽。

怎么確認收口有没有生效

看三處:服務器日誌里重复地址的抓取次數是否下降;Search Console 的“重复網頁,用戶未選定規范網頁”是否减少;“已發現 - 尚未编入索引”的數量是否回落。判断周期要给够,改完内鏈和 Sitemap 後,蜘蛛重新走一遍通常需要數周時間。

一個常见的执行顺序

  1. 從日誌里列出被抓次數最多的前几十個 URL,去掉參數看真實路径。
  2. 逐個判断:保留、合並,還是彻底不要。
  3. 合並的做 301,不要的用 robots.txt 挡,保留的寫進 Sitemap。
  4. 全站内鏈換成規范寫法,包括頁脚和侧栏里那些長期被忽略的連結。
  5. 過一段時間再比對日誌,確認抓取集中到了有價值的頁面上。
canonical 解决“哪一個是正本”,301 和 robots.txt 解决“會不會被請求”。把這两件事分開做,重复 URL 的抓取量才會真正降下来。