搜索抓取

中文、空格与大小写:同一个页面为什么被抓成了好几个 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 变漂亮,而是让蜘蛛在有限的抓取次数里,把注意力放在一个地址上,而不是几个入口之间来回切换。

怎么检查有没有漏

从日志里筛出含 % 的请求、含大写字母的路径、以及同一路径带与不带结尾斜杠的记录,对比一下规范化前后各自的抓取次数。如果规范写法的那一条在缓慢上升、其他写法在下降,说明跳转和链接生成已经生效。之后每次改模板或换链接生成逻辑时,再抽查一遍即可。