搜尋抓取

同一個頁面的多個地址:蜘蛛在 URL 規范化上會怎么選

蜘蛛的抓取队列按 URL 排队,同一份内容有多個地址时,每個地址都是獨立的抓取對象。本文從协议、主机、尾斜杠、參數等常见重复来源讲起,說明蜘蛛在抓取前後如何归並地址,以及 301、canonical 和站内連結這三個信号该怎么配合使用。

搜尋抓取

同一個頁面的多個地址:蜘蛛在 URL 規范化上會怎么選

蜘蛛的抓取队列是按 URL 排的,不是按「頁面」排的。同一份内容如果存在多個可訪問地址,每個地址在蜘蛛眼里都是一個獨立的待抓取對象。URL 規范化(也叫 URL 归一化)要解决的,就是把這些地址尽量收敛成少數几個,让抓取资源用在真正需要的地方。

重复地址通常從哪来

在排查之前,先知道常见的重复形態,多數站点的重复並不是内容複製,而是入口寫法不统一:

  • 协议與主机差异:http 與 https、带 www 與不带 www 同时可訪問。
  • 路径大小寫不同,例如 /About 和 /about 都能打開。
  • 尾斜杠差异:/list 與 /list/ 返回同一頁。
  • 預設文件名:/ 與 /index.php、/index.html 並存。
  • 參數组合:排序、篩選、追踪參數、會话 ID。
  • 附属版本:打印頁、移動版、AMP 版各有一個地址。

抓取之前的初步归一

在真正發出請求之前,蜘蛛通常會對 URL 做一轮机械處理:协议和主机名轉小寫、去掉預設端口、解析相對路径、去掉 # 後面的片段(片段不會發送给服務器)。但這只是文本层面的归並。只要服務器對两個地址都返回了内容,它們仍然可能被分別抓取,所以這轮處理只能减少一部分重复,剩下的要靠站点自己给信号。

决定收敛的三個信号

301 跳轉

最直接的信号。让其中一個地址返回 301,指向你希望保留的那個,蜘蛛跟着跳轉後,通常會把權重和抓取记錄归到目标地址上。注意两点:跳轉要一步到位,不要 A→B→C;跳轉目标本身不要再依赖另一個跳轉。

rel=canonical

canonical 是提示,不是指令。它能帮助蜘蛛理解你的偏好,但当它與站内連結、sitemap、301 给出的信号互相矛盾时,最终判断未必如你所愿。比較常见的自相矛盾是:多個重复地址的 HTML 里,canonical 都指向自己。

站内連結指向哪一個

内鏈是持續的投票。如果站内一半連結指 A、一半指 B,蜘蛛很可能两邊都抓、两邊都保留。想收敛,先從模板层的連結寫法统一開始,這比事後加 canonical 更省事。

參數要不要留

判断标准可以简單一些:會影响頁面正文的參數属于有效參數,通常需要保留,但要控制组合數量,避免篩選條件能被無限叠加;纯追踪類參數(utm 系列、渠道标识、會话 ID)尽量只出現在外部来源的連結上,站内連結和 sitemap 里不要带。真正麻烦的不是單個參數,而是參數能自由组合出的排列,蜘蛛很容易在這種頁面上消耗掉大部分抓取量。

服務器层面的一致性

如果两種地址都返回 200 且内容完全一致,蜘蛛只能靠 canonical 去猜你的意图。更稳的做法是让其中一個明确返回 301。另外要確認不同地址返回的 HTML 是否一致,有些站点的移動版和桌面版 canonical 規則不同,容易互相指向對方。

可以按顺序做的自查

  1. 翻抓取日誌,看同一個路径出現了几種寫法,各自被訪問了多少次。
  2. 检查站内連結是否统一:绝對路径還是相對路径,带不带尾斜杠。
  3. 检查 canonical 是否指向自身頁面,而不是希望保留的目标地址。
  4. 检查 sitemap 里提交的是哪一種寫法,是否和站内連結一致。
  5. 检查 301 是否指向最终地址,鏈路上有没有多余的中間跳轉。
規范化做得好不好,一個直观的观察指标是:抓取日誌里「内容相同但地址不同」的條目占比。這個比例長期偏高,說明站点還在把抓取量花在重复地址上。

URL 規范化不是一次性配置,而是連結寫法、跳轉規則、canonical 和 sitemap 四者長期保持一致的结果。任何一處先改動,另外三處跟不上,重复地址就會重新長出来。