搜尋抓取

URL 归一化與蜘蛛抓取:大小寫、编碼和參數顺序里的重复發現

同一個頁面如果存在多種 URL 寫法,蜘蛛會当成多個地址分別抓取,抓取額度被稀释、日誌也难對帳。本文梳理大小寫、结尾斜杠、預設端口、URL 编碼、參數顺序與跟踪參數等常见分叉点,给出服務端统一、内鏈收敛和日誌驗證的具体做法。

搜尋抓取

URL 归一化與蜘蛛抓取:大小寫、编碼和參數顺序里的重复發現

蜘蛛並不理解頁面内容,它首先認的是 URL 字符串。两個字符串只要有一個字符不同,在它眼里就是两個地址。于是同一份内容可能被請求很多次,抓取額度被摊薄,日誌里也堆满了看起来相似却對不上的记錄。

归一化要解决的問题就是:让同一個頁面在站内、Sitemap、外鏈和日誌里尽量只以一種形態出現。

蜘蛛是怎么看待 URL 的

在抓取阶段,蜘蛛主要做字符串层面的處理和去重。它不會自動帮你判断 /About 和 /about 是不是同一個頁面,也不會因為參數顺序不同就認定它們是同一地址。只有当服務端返回跳轉,或者頁面上有明确的規范信号时,它才有可能把多種形態归拢到一起。

換句话说,归一化的第一道關口在服務端,第二道在内鏈輸出,第三道才是 canonical 之類的頁面級信号。

常见的归一分叉点

  • 路径大小寫:/About、/about、/ABOUT 在某些服務器上都能訪問,于是變成三個 URL。
  • 结尾斜杠:/list 與 /list/ 是否都返回 200,取决于服務器配置。
  • 預設端口與协议:带 :80、:443 的寫法,以及 http 與 https 並存。
  • 主机名:example.com 與 www.example.com,以及大小寫混寫的主机名。
  • 目錄預設文件:/index.html 與 / 指向同一份内容。
  • URL 编碼:中文路径可能被编碼成大寫或小寫的百分号形式;%2F 與 / 在部分环境下含义不同。
  • 參數顺序:?a=1&b=2 與 ?b=2&a=1 是不同字符串。
  • 空值與跟踪參數:?utm_source=xxx、?from=、?spm= 這類參數會在分享和投放中被不断追加。
  • 片段标识:井号後的内容不會發给服務器,但带井号的連結如果被当成路径寫入内鏈,就會产生新的字符串。

重复發現带来的實际問题

最直接的影响是抓取资源被分散。假设一個栏目有 200 個頁面,但因為大小寫和參數组合,實际被發現的 URL 有 1500 個,蜘蛛用在真正内容上的時間就少了很多。

其次是日誌失真。做抓取分析时,如果按原始 URL 統計,很可能會得出栏目有大量頁面從未被抓取的结论,而真實情况只是同一頁面用了不同寫法。

统一做法:從服務端到内鏈

  1. 确定唯一形態:先定一套規則,例如全小寫路径、不带结尾斜杠、统一 https 加 www 或统一不带 www,然後全站按這套規則执行。
  2. 服務端做 301:把其他形態永久跳轉到規范形態,跳轉目标直接指向最终地址,不要串成多跳。
  3. 内鏈只輸出規范形態:導航、面包屑、列表頁、相關推荐里的連結统一寫法,避免站内自己制造分叉。
  4. Sitemap 只放規范 URL:清單里出現非規范寫法,等于主動把重复地址再喂给蜘蛛一次。
  5. 頁面加自引用 canonical:規范頁指向自己,參數頁或分頁頁指向對應主地址,作為兜底信号。
  6. 跟踪參數單獨處理:能去掉的在服務端重定向掉,必须保留的用 canonical 或 robots 規則控制抓取。

用日誌驗證是否生效

做法不复杂:把訪問日誌按路径聚合,再把查询參數按字典序排序後当作同一個键統計,看看同一路径下還剩多少種形態。如果某個栏目仍然出現几十種變体,說明還有入口在輸出非規范連結。

也可以抽查一段時間内被抓取的 URL,挑出带參數的记錄,人工判断哪些是有效篩選、哪些只是跟踪參數。這一步通常能很快定位到問题来源,比如某個分享组件、站内搜尋框或者舊的外鏈。

归一化不是一次性配置,而是一個持續對帳的過程。每次改版、換服務器、加投放參數之後,都值得回头看一眼日誌里的 URL 形態有没有變多。

別走過头

有些參數确實承载内容,比如篩選、排序、分頁,這類地址不该一律跳走,否則會誤伤正常頁面。同样,编碼形式的不一致如果只出現在极少數舊連結上,做一次跳轉就够了,不必為它改動整体结构。

判断标准可以简單一些:這個地址是否會被用戶或外部連結用到?會,就保留並做跳轉;不會,就让它自然消亡。