蜘蛛在队列里记录的不是“某个页面”,而是一条条 URL 字符串。只要字符串不同,它就会当成不同资源去抓。很多站点并不是内容少,而是同一份内容被拆成了好几条 URL,抓取动作重复发生,日志里看起来热闹,实际有效覆盖并没有增加。
常见的重复 URL 来源
以下情况在日志和 Sitemap 中经常同时出现:
- 协议与主机名:http 和 https、带 www 和不带 www、带默认端口和不带端口,如果都能返回 200,蜘蛛就可能各抓一遍。
- 大小写混用:/Page 和 /page 在多数服务器上等价,但蜘蛛按字符串区分。
- 末尾斜杠:/a 与 /a/ 是否都返回页面,取决于服务器配置。
- 参数顺序与冗余参数:?a=1&b=2 和 ?b=2&a=1、跟踪参数、会话 ID、排序参数,都会生成新 URL。
- 路径重复斜杠与编码://a、/a%2Fb 这类写法如果服务器不归一化,也会进入抓取队列。
- 分页与筛选组合:同一列表页因排序、每页数量、筛选条件产生大量可抓 URL。
重复抓取带来的实际影响
最直接的是抓取预算被摊薄。蜘蛛把时间用在重复版本上,新页面和重要更新页面的发现就会变慢。其次是索引信号分散:外链和点击可能指向不同版本,权重和 canonical 判断容易摇摆。第三是日志噪音变大,排查真实抓取问题时更难看清哪些 URL 值得关注。对服务器来说,重复请求也会增加无意义的响应压力。
把 URL 收敛到规范版本
处理思路不是把重复 URL 全部屏蔽,而是明确一个规范版本,并让站内站外都指向它。
- 确定唯一规范:协议、主机名、大小写、末尾斜杠、参数规则都要定下来,写进站点配置和编辑规范。
- 用 301 跳转旧版本:能永久跳转的重复入口尽量用 301,而不是返回 200 或 302 长期挂着。
- 页面加 canonical:不能跳转或需要保留的变体,用 canonical 指向规范 URL,并确保 canonical 本身可访问、返回 200。
- 内链和 Sitemap 保持一致:导航、面包屑、分页、Sitemap 只输出规范 URL,避免站内自己制造重复入口。
- 处理跟踪参数:对营销参数、会话参数设定统一规则,能忽略的忽略,必须保留的用 canonical 或跳转收敛。
- 用日志验证:观察蜘蛛是否还在抓非规范版本,以及规范版本是否被稳定抓取。
几个容易做错的地方
不要把有独立内容价值的筛选页一刀切跳走,否则可能损失真实入口。canonical 与 301 不要互相矛盾:一边跳转一边 canonical 指向另一个地址,蜘蛛会反复确认。CDN 缓存键如果包含完整查询串,也可能让同一页面在边缘节点出现多个副本,需要和缓存配置一起检查。
URL 规范化不是一次性设置,而是内容发布、模板改动和营销活动都要遵守的约束。
结语
定期从服务器日志里抽样,看看蜘蛛抓取的 URL 中有多少是规范版本、多少是重复版本。重复比例高时,优先检查 301、canonical、内链和参数规则,通常比继续加 Sitemap 条目更能改善抓取效率。