搜尋抓取

中文、空格與大小寫:同一個頁面為什么被抓成了好几個 URL

站点里出現中文目錄、空格或大寫字母时,同一個頁面往往會有好几種 URL 寫法。本文說明這些编碼差异從哪来、在抓取日誌里如何表現,並给出统一規范形式的几條具体做法,帮助把分散的抓取收敛到一個地址上。

搜尋抓取

中文、空格與大小寫:同一個頁面為什么被抓成了好几個 URL

站点里只要出現過中文目錄名、带空格的參數,或者從後台系統里直接複製的連結,同一個頁面就很容易被蜘蛛遇到好几種寫法。寫法差异本身不會让頁面打不開,但會让一次抓取被拆成好几次,日誌看起来也會比較乱,内鏈传递的指向也跟着分散。

编碼差异一般從哪里来

同一條連結出現多個版本,通常不是有人故意寫了第二遍,而是各個环节各寫各的:

  • 浏览器地址栏複製出来的連結,中文可能已经被轉成百分号编碼;
  • CMS 或建站工具自動生成的内鏈,习惯保留原文;
  • 手工寫死在模板里的連結,作者当时的寫法是什么就是什么;
  • 第三方統計、广告或分享组件拼接的追踪連結,经常顺手加上參數和大小寫變体;
  • 舊版頁面迁移时留下的老地址,没有做跳轉就直接下线了。

常见的三種寫法

以「搜尋/教程」這類带中文的路径為例,實际出現在網頁源碼里的可能長這样:

  • 直接寫中文:源碼里保持 UTF-8 原样字符,看起来最清楚;
  • 百分号编碼:中文被轉成 %E6%90%9C%E7%B4%A2 一類的形式,長度明顯變長;
  • 空格的不同處理:空格有时寫成 +,有时寫成 %20,视觉上几乎看不出区別。

對服務器来说,這些寫法经過解析後往往指向同一份内容;但對蜘蛛来说,它們是几個不同的字符串,會被当成几個獨立的地址分別排队抓取。

在日誌和抓取統計里是什么样

如果你按 URL 去統計抓取次數,很快會發現問题:

  • 同一篇文章在日誌里以两三條不同的地址反复出現,單條的抓取次數都不高;
  • 被連結最多的那個版本,未必是你在 canonical 里声明的那個;
  • 带參數、带编碼的版本更容易被外部連結引用,反而先被發現;
  • 統計里看起来「抓取量被分薄了」,其實是同一個頁面在重复排队。

把寫法收敛到一條

處理思路和重定向鏈類似,重点是让所有出口都從同一個地方生成連結:

  1. 服務端统一跳轉:非規范寫法一律 301 到規范寫法,跳轉目标直接给最终地址,不要再跳第二次。
  2. 内鏈统一生成:面包屑、列表頁、分頁、相關推荐都調用同一個連結生成函數,避免模板里各處寫法不同。
  3. Sitemap 只放規范形式:清單里出現混合寫法,等于主動把混乱再交代一遍。
  4. canonical 指向規范地址:頁面内声明和 301 目标保持一致,不要一個指 A 一個指 B。
  5. 外部来源尽量對齐:合作方、投放連結、舊域名入口,能改的改,改不了的靠 301 兜住。

大小寫和结尾斜杠也別忽略

在多數 Linux 服務器上,/News//news/ 是两個不同的地址,结尾带不带斜杠也常常是两個。這两類差异不會在源碼里顯示成乱碼,所以更不容易被察觉。比較稳妥的做法是:全站统一小寫,目錄類地址统一带结尾斜杠,然後在服務器层把不符合規則的形式跳轉過去。

規范化的目标不是让 URL 變漂亮,而是让蜘蛛在有限的抓取次數里,把注意力放在一個地址上,而不是几個入口之間来回切換。

怎么检查有没有漏

從日誌里筛出含 % 的請求、含大寫字母的路径、以及同一路径带與不带结尾斜杠的记錄,對比一下規范化前後各自的抓取次數。如果規范寫法的那一條在缓慢上升、其他寫法在下降,說明跳轉和連結生成已经生效。之後每次改模板或換連結生成逻辑时,再抽查一遍即可。