搜尋抓取

URL 归一化與抓取去重:同一内容多個地址时怎么减少重复路径

同一篇内容出現多個 URL,蜘蛛往往按地址分別抓取,重复消耗抓取预算。本文從大小寫、斜杠、參數、协议和域名等常见差异入手,說明如何用 canonical、301、Sitemap 和内鏈把地址收口到主 URL,並给出日誌與抓取工具的检查思路。

搜尋抓取

URL 归一化與抓取去重:同一内容多個地址时怎么减少重复路径

蜘蛛發現一個 URL 後,通常不會先判断“這個頁面我是不是已经抓過”,而是把 URL 当作唯一标识放進待抓队列。只要地址字符串不同,它就可能当成新頁面再抓一次。同一篇内容如果存在多個地址,重复抓取就會消耗抓取预算,也會让頁面信号變得分散。

同一内容為什么會出現多個 URL

常见差异不一定是有人故意制造,很多是技術配置自然产生的:

  • 大小寫不同:/Article/123/article/123 在蜘蛛眼里是两個 URL。
  • 末尾斜杠有無:/page/page/ 可能被分別抓取。
  • 协议與主机名:http 與 https、www 與非 www、带端口與不带端口。
  • 參數顺序或跟踪參數:?a=1&b=2?b=2&a=1,以及 utm、ref、session 等。
  • 分頁、排序、篩選參數:同一列表頁因參數组合生成大量地址。
  • 打印頁、AMP、移動版等獨立地址。

這些地址如果都返回 200,且没有明确信号告诉蜘蛛“哪個是主地址”,蜘蛛就可能多次来訪。

蜘蛛如何判断该抓哪個地址

蜘蛛主要依赖几個信号:

  1. 301 跳轉:把舊地址永久指向新地址,抓取路径會在第一跳後收口。
  2. canonical:在頁面头部声明規范地址,告诉蜘蛛這一组地址中哪個是主版本。
  3. Sitemap:只提交規范地址,减少蜘蛛從清單里發現重复 URL 的机會。
  4. 内鏈锚点:站内連結尽量指向主地址,不要让同一内容在導航里出現多個版本。

需要注意的是,canonical 是提示,不是强制命令;301 更明确,但只适合地址真正迁移的场景。两者如果互相矛盾,蜘蛛會重新判断,收口效果反而變差。

用 canonical 和 301 把地址收口

如果是协议、域名、路径结构變化,優先用 301。比如全站從 http 迁到 https,或從带 www 统一到不带 www,應让舊地址整站跳轉到新地址,而不是只在部分頁面加 canonical。

如果是同一頁面因參數、打印版、排序方式产生多個地址,更适合用 canonical。規范地址應当是自己返回 200、可正常抓取、内容完整的版本。不要把 canonical 指向一個 404、重定向或 noindex 的頁面。

一個常见誤区:把带參數的篩選頁全部 canonical 到無參數列表頁。如果篩選頁有獨立搜尋價值,這样可能让蜘蛛不再抓取篩選内容;如果篩選頁只是组合參數,則可以考虑用 robots 或參數處理規則收口。

Sitemap 與内鏈只保留主地址

Sitemap 是地址清單,不是越多越好。把同一内容的多個版本都寫進 Sitemap,等于主動告诉蜘蛛有更多 URL 需要抓。更稳妥的做法是:

  • Sitemap 只放規范 URL,並保持與頁面 canonical 一致。
  • 站内導航、面包屑、相關推荐等連結,统一指向規范地址。
  • 分頁、篩選、排序等參數地址,按實际需要决定是否進入 Sitemap。
  • 跟踪參數尽量在生成連結时去除,不要等蜘蛛抓到後再處理。

怎么检查重复抓取有没有减少

可以结合服務器日誌和抓取工具观察:

  • 日誌中同一路径带不同參數、大小寫、斜杠的訪問量是否下降。
  • 抓取工具請求主地址时,返回的 canonical 是否指向自己。
  • Sitemap 中的 URL 與頁面 canonical 是否大面积一致。
  • 带參數 URL 的抓取频次是否仍然很高,如果高,检查内鏈或 JS 是否在大量生成參數連結。

URL 归一化不是一次性配置。改版、上新功能、加統計參數都可能重新产生重复地址。把 canonical、301、Sitemap 和内鏈当作一套持續维護的規則,蜘蛛的抓取路径會更干净,抓取预算也更可能用在真正需要更新的頁面上。