搜尋抓取

同一頁面被抓多次:URL 归一化怎么做

同一個内容頁被蜘蛛用多條 URL 抓取,是很多站点都會遇到的情况。本文梳理大小寫、末尾斜杠、协议與主机名、參數顺序、跟踪參數等常见的不一致寫法,說明怎么從站内連結、服務端跳轉和 canonical 三层做归一化,以及如何用日誌與 Sitemap 驗證收敛效果。

搜尋抓取

同一頁面被抓多次:URL 归一化怎么做

翻服務器日誌时,很多运营者會發現一個現象:同一個内容頁,被蜘蛛用好几條不同的 URL 抓過。抓取次數被摊薄,日誌分析也跟着失真。這通常不是蜘蛛抓错了,而是站点自己给出了多個入口。

同一頁面為什么會有多個 URL

常见的不一致寫法大体集中在几類,先列出来對照自查:

  • 大小寫不一致:/About 與 /about 都被返回 200。
  • 末尾斜杠:/list 與 /list/ 同时可訪問。
  • 协议與主机名:http 與 https、带 www 與不带 www 並存,或改版後只跳了一半的連結。
  • 參數顺序與冗余參數:?a=1&b=2 與 ?b=2&a=1 被视為不同地址。
  • 跟踪參數:渠道、投放、會话類參數被寫進了站内連結。
  • 编碼差异:中文路径的百分号编碼在大小寫上不统一。

這些寫法在浏览器里都能打開同一個頁面,但對爬虫来说就是不同的 URL,會分別排队、分別抓取、分別判断内容。

先统一站内連結,再谈其他

内鏈是最直接的信号来源。導航、面包屑、列表頁、相關推荐、Sitemap、RSS,只要其中一部分指向 A 寫法、另一部分指向 B 寫法,蜘蛛就會按两條 URL 處理。所以归一化第一步不是加标簽,而是把站内所有出口统一成同一種寫法。這一步做完,很多重复抓取會自然减少。

归一化的三层處理

  1. 入口层:模板、Sitemap、推送接口统一輸出規范寫法,避免新連結再次跑偏。
  2. 服務端层:對非規范寫法做 301 到規范 URL,把歷史連結和外部引用一起收拢。
  3. 頁面层:用 canonical 声明首選版本,作為兜底手段。

301 與 canonical 不是二選一。能干净跳轉的用 301;跳轉不方便實現、或者需要保留訪問參數的场景,用 canonical 指明首選版本。两者作用点不同,可以叠加使用。

參數怎么收敛

參數是最容易失控的一類。跟踪參數、排序參數、篩選參數、會话參數各自组合,能生成大量 URL。處理思路是先分類:影响内容的參數(篩選、排序)通常保留,但要让每個组合有可抓取的價值;不影响内容的參數(渠道、會话、来源标记)尽量在生成連結时就去掉,或在服務端做跳轉剥离。不要用一刀切的方式屏蔽所有參數,否則會连同正常的分頁、篩選一起拦掉。

怎么驗證收敛效果

做完調整之後,用几個動作回看是否生效:

  • 按路径分组統計日誌里的抓取次數,看是否還存在同一路径的多種寫法。
  • 把自己爬一遍站内連結得到的 URL 集合,與 Sitemap 里的 URL 做對比。
  • 抽查頁面的 canonical 是否自指、是否指向規范版本,避免指向一個會跳轉的地址。
  • 观察一段時間内重复版本的抓取量是否下降。
归一化不是一次性工作。上线新模块、改版換模板、接入新的統計或投放參數时,都容易重新引入不一致的寫法,需要定期回看。

目标其實很简單:把同一個内容收敛到一個 URL 上,减少没有意义的重复抓取,让有限的抓取机會留给真正需要更新的頁面。做不到百分之百干净也没關系,先把量級最大的那几類寫法處理掉,效果通常就出来了。