搜尋抓取

同一内容多個地址:蜘蛛抓取时的去重與規范化選擇

同一份内容常常存在多個可訪問地址,比如 http 與 https、带與不带 www、尾斜杠差异、跟踪參數等。蜘蛛會先做 URL 层面的精确去重,再做内容层面的近似判断,最後才參考 canonical、内鏈和 Sitemap 给出的提示。本文梳理這些重复地址的来源、在抓取日誌中的表現,以及規范化處理的優先顺序與常见誤区。

搜尋抓取

同一内容多個地址:蜘蛛抓取时的去重與規范化選擇

做站点运营时,经常會遇到這样的情况:同一篇文章,通過好几個地址都能打開。對用戶来说也许没差別,但對蜘蛛来说,這是多份候選 URL,抓取和判断都要多花一份力气。理解蜘蛛怎么在多個地址之間做選擇,能帮我們把抓取资源用在真正需要的地方。

重复地址一般從哪来

多數重复不是刻意制造的,而是站点演進過程中自然留下的:

  • 协议與主机名:http 與 https、带 www 與不带 www,四個组合同时可訪問。
  • 路径寫法:末尾带斜杠與不带斜杠、大小寫混用、中文路径编碼方式不同。
  • 參數版本:跟踪參數、排序參數、會话标识,让同一列表頁出現几十個變体。
  • 功能頁副本:打印版、移動版、AMP 版、预览連結,各自有獨立 URL。
  • 编号與別名並存:一篇文章同时有 ID 路径和标题別名路径。

這些地址如果都能返回 200,蜘蛛就需要自己判断它們是同一份内容還是不同内容。

蜘蛛大致會分三层處理

第一层:URL 层面的精确去重

最基础的判断發生在字符串层面。完全相同的 URL 只會被抓一次,抓過的地址會進入队列记錄。這一层不看内容,只看地址本身,所以任何字符差异都會被视為新地址。

第二层:内容层面的近似判断

当多個地址被抓回来後,蜘蛛會比較正文主体、标题、结构等信息,判断它們是否高度相似。如果相似度高,通常會選一個作為代表版本,其余的在抓取調度上降權。這個過程對站点是黑盒,我們能做的只是把信号给清楚。

第三层:站点给出的規范提示

canonical 标簽、内鏈指向、Sitemap 中列出的地址、301 跳轉,都是站点主動表達偏好的方式。其中 301 的信号最强,canonical 相對温和。

canonical 是提示而不是命令。它需要和其他信号一致才有说服力,如果内鏈指向 A、canonical 指向 B、Sitemap 又列出 C,等于给了三個方向。

從抓取日誌能看出什么

重复地址的問题往往先体現在日誌里,而不是在頁面表現上:

  • 同一内容的多個地址反复被抓,且频次接近,說明蜘蛛還没确定哪個是主版本。
  • 參數版本抓得很勤,干净地址反而少见,說明内鏈或歷史入口把蜘蛛引偏了。
  • 規范版本長期不更新抓取,非規范版本持續被抓,通常是两邊的内鏈和跳轉關系混乱。

把這些地址按路径归類統計,比逐條看日誌更容易發現問题。

處理的優先顺序

遇到重复地址,建议按下面的顺序處理,不要一上来就用禁止抓取:

  1. 能 301 就 301。协议、主机名、尾斜杠這類寫法差异,用一次跳轉永久固定下来,成本最低。
  2. 统一内鏈與 Sitemap。全站連結只指向規范地址,Sitemap 只列規范版本,避免自己制造分叉。
  3. 用 canonical 兜底。對于無法跳轉的场景,如參數頁、打印頁,用 canonical 指向主版本。
  4. 谨慎使用 robots 屏蔽。屏蔽能阻止抓取,但也意味着頁面上的 canonical 提示可能讀不到,两者叠加容易产生矛盾信号。
  5. 參數做集中處理。對站内搜尋、排序、篩選參數,優先用規則收敛入口,而不是逐個屏蔽。

几個容易踩的坑

  • canonical 指向一個已经被 robots 屏蔽的地址,等于把信号丢進了黑洞。
  • 两個地址互相 canonical,蜘蛛無法從中得到明确结论。
  • 把分頁頁面的 canonical 全部指向第一頁,導致後續頁面的新内容失去被發現的机會。
  • 移動版與桌面版各自 canonical 到自己,形成两套並行体系。
  • 只在首頁做了跳轉,深层連結仍然保留舊寫法。

日常检查清單

可以把下面几件事纳入常規巡检:核對协议與主机名的跳轉是否一次到位;抽查内鏈是否统一指向規范地址;對照 Sitemap 與實际可訪問地址是否一致;統計日誌中同一内容對應的地址數量是否有上升趋势。規范化不是一次性的清理工作,新栏目、新功能上线时都可能带出新的重复入口。把規則固定下来,比事後逐個补救更省力。