蜘蛛抓取站点时,第一步不是下载页面,而是决定“这个 URL 值不值得抓”。如果站点自己把同一个页面暴露成多个地址,蜘蛛就会把它们当成不同入口,分别排队、分别抓取。URL 归一化要解决的正是这件事:让蜘蛛明确知道哪个地址才是这个页面的代表。
蜘蛛眼里的“不同 URL”有哪些
很多差异在浏览器里看起来一样,但对抓取程序来说就是另一个字符串。
- 大小写:/Page 和 /page 在多数服务器上可能指向同一内容,但 URL 本身不同。
- 末尾斜杠:/list 和 /list/ 是否等价,取决于服务器配置,蜘蛛不会自动合并。
- 协议与主机名:http 与 https、带 www 与不带 www,都是不同的主机入口。
- 默认端口::80 或 :443 写出来与不写出来,可能形成两个地址。
- 查询参数:顺序不同、跟踪参数、会话 ID、排序筛选参数,都会制造大量变体。
- 锚点片段:#section 通常不参与服务器请求,但页面内链接写多了,容易让人误以为产生了新 URL。
归一化没做好,抓取路径会变成什么样
最直接的影响是抓取预算被摊薄。蜘蛛本来可以用于更新重要页面的时间,被拿去反复请求同一内容的多个地址。日志里看起来抓取量很大,实际有效覆盖并没有增加。
其次是信号分散。内链、外链、Sitemap、canonical 如果各指一个变体,蜘蛛收到的就是互相矛盾的提示:到底哪个地址该被当作代表页?在极端情况下,蜘蛛可能把权重和更新信号分给不同地址,页面表现变得不稳定。
归一化不是“消灭所有参数”,而是让蜘蛛在发现 URL 时,能沿着一条明确的路径走到代表页,而不是在几个等价地址之间反复打转。
站点可以做的几件事
1. 内链先统一
站内链接是蜘蛛最常走的路径。导航、面包屑、列表页、正文推荐位,都尽量指向同一个规范地址。如果模板里有时输出 /list,有时输出 /list/,蜘蛛就会跟着两个入口走。
2. 用 301 收拢旧变体
已经存在的变体,尽量用 301 永久重定向到规范地址。重定向链不要太长,一次跳到目标比多次跳转更容易被顺利跟进。服务器要稳定返回 301,不要时而 302、时而 200。
3. canonical 与 Sitemap 保持一致
canonical 标签是页内提示,Sitemap 是站点级清单,两者最好都写规范 URL。如果 Sitemap 里同时提交多个变体,等于主动把重复入口递给蜘蛛。
4. 参数处理要有边界
筛选、排序、分页参数有些是内容必需的,有些只是跟踪或会话用途。对后者,可以在服务器或抓取设置里做归并,但不要一刀切屏蔽,以免误伤真正需要被发现的列表页。
服务器稳定性也在影响归一化效果
归一化方案再清晰,如果服务器响应不稳定,蜘蛛可能跟到一半就放弃。301 返回超时、规范页偶发 5xx、重定向目标不可达,都会让蜘蛛退回旧变体继续抓。保持响应码明确、跳转目标可用,比堆更多规则更重要。
一个简单的自查清单
- 站内链接是否始终指向同一套规范 URL?
- http/https、www/非 www 是否只有一个主入口?
- 旧变体是否 301 到规范地址,且跳转链尽量短?
- canonical 与 Sitemap 里的地址是否一致?
- 跟踪参数是否被有效识别,而不是被当成新页面?
- 规范页是否稳定返回 200,服务器超时是否可控?
把这些基础项对齐后,蜘蛛的抓取路径会更干净:发现的是规范 URL,跟进的也是规范 URL,抓取预算才更可能花在真正需要更新的内容上。