蜘蛛池入口页里挂的目标 URL,很多是批量生成的。同一批目标,写法上只要有一点差别——大小写、末尾斜杠、端口、参数顺序——就可能被搜索蜘蛛当成几个不同的地址分别去抓。抓取预算是有限的,地址被拆散以后,想推的那一个反而迟迟不被发现。下面把常见情况拆开说。
搜索蜘蛛处理的是字符串,不是“页面”
搜索蜘蛛在发现阶段拿到的就是一串字符。它先按规则把相对地址拼成绝对地址,再判断这是不是一个没见过的 URL。它不会先去打开页面看内容是不是一样。所以两个字符串不同,就很可能进入两条独立的抓取队列,至于最后会不会被合并,取决于后续的规范化信号,比如跳转、canonical,这不是发现阶段能解决的。
哪些写法差异可能真的会分裂 URL
- 域名大小写:域名部分不区分大小写,Example.com 和 example.com 一般视为同一主机;但路径和查询参数区分大小写,/Page 和 /page 在多数服务器上是两个资源。
- 末尾斜杠:/a 与 /a/ 如果没有服务器跳转收敛,就是两个地址,可能返回不同内容,也可能一个 200、一个 301。
- 默认端口:http://example.com:80/a 与 http://example.com/a 语义等价,但服务器没做归一化跳转时,日志里会出现两种请求形式。
- www 与非 www:最典型的一对,建议只保留一个版本,把另一个用 301 收过去。
- 参数顺序与无意义参数:?a=1&b=2 与 ?b=2&a=1 是两个字符串;加一个只给统计用的参数,也会变成新地址。
- 编码写法:空格写成 %20 还是 +、百分号编码用大写还是小写十六进制,服务器处理方式不同就可能落到不同路径上。
- 锚点:# 后面的片段不会随请求发给服务器,通常不产生新 URL;但如果站点用前端路由,把 # 之后当路径处理,就要另算。
哪些是误判,哪些是真问题
不是所有差异都值得处理。域名大小写、默认端口这类,正规服务器和 CDN 一般会先做一次跳转,实际不容易积累重复。真正容易出问题的是三种:批量生成链接时没统一规则、服务器没有对末尾斜杠和 www 做收敛、以及用参数区分内容却又不做规范化。第一种是入口页的问题,第二种是服务器配置的问题,第三种是 URL 设计的问题。
自查顺序
- 从入口页抓一批链接,统一解析成绝对地址,按主机、路径、参数排序,看是否存在同一目标的多种写法。
- 对每种写法各请求一次,看返回码是 200 还是 301,跳转目标是否统一。
- 翻服务器日志,按路径去重统计,看同一目标是不是有多个 Path 在被抓。
- 检查页面里的 rel=canonical 指向的是不是唯一版本,以及 sitemap 里放的是哪一版。
- 确认站内链接、入口页链接、sitemap 三处给出的规范形式是否一致。
处理建议
入口页生成链接时就用同一个规范形式:主机统一带或不带 www、路径统一末尾斜杠风格、参数按固定顺序输出、不要塞跟踪参数。服务器层面把变体 301 到规范地址,canonical 与 sitemap 都指向同一版。这样搜索蜘蛛见到的就只有一个地址,抓取预算不会被摊掉。
规范化的目标不是让每个变体都能被抓,而是让同一份内容只对应一个地址。变体越多,发现越慢。