在抓取日志里经常会看到一种情况:同一篇文章,蜘蛛用七八个不同的地址访问过。标题、正文、图片都一样,只有 URL 不同,于是每一次访问都要重新下载、重新解析、重新判断。URL 变体不会立刻让页面出问题,但它会持续消耗抓取额度,也让“蜘蛛到底发现了哪些 URL”这件事变得难以判断。
同一个页面为什么会变成多个地址
大部分变体不是蜘蛛造出来的,而是站点自己提供的。常见来源有几类:
- 形式差异:结尾有没有斜杠、路径大小写、http 与 https、带不带 www,这几种写法如果都能返回 200,就是四个独立地址。
- 参数差异:参数顺序不同、多余的空参数、默认值参数,都会让同一个列表页生成多个 URL。
- 跟踪参数:分享、投放、统计工具自动附加的参数,如果内链里也带着,蜘蛛会顺着它们一路抓过去。
- 筛选项与排序:颜色、价格、排序方式组合起来,很容易把一个分类页翻成几十个地址。
- 会话与临时 ID:部分老系统会把 sessionid 写进 URL,同一用户每次访问地址都不同。
这些地址如果都返回正常内容,蜘蛛没有理由拒绝其中之一,只能逐个抓取。
变体地址带来的三层影响
抓取额度被摊薄
搜索引擎给每个站点的抓取量,大致与站点规模、更新频率、响应速度相关。当同一份内容占用多个 URL 时,真正的新页面分到的次数就会减少。表现是旧内容反复被抓,新发布的页面却迟迟不来。
内链指向不统一
导航里写带斜杠的版本,正文里写不带斜杠的版本,分享按钮又生成带参数的版本。蜘蛛沿着不同的内链走到同一个页面,会把这些都记成独立的发现路径,链接信号也随之被拆散。发现路径越多,真正需要注意的新 URL 反而越容易被淹没。
日志与数据失真
统计“今天蜘蛛抓了多少页面”,如果不先去重,得到的是变体数量而不是内容数量。判断抓取是否异常、某个栏目是否被冷落,都会因此得出错误结论。
把变体收敛成一条地址
- 先定规范形态:明确使用 https、是否带 www、路径是否带结尾斜杠、保留哪些参数,写进开发规范,新页面直接按规范生成。
- 让旧地址 301 过去:形式差异的变体用永久重定向指向规范 URL,不要用 302,也不要让两个地址长期同时返回 200。
- 修正内链:导航、面包屑、正文、页脚、分页链接统一使用规范写法;分享和统计参数交给前端处理,不要出现在 a 标签的 href 里。
- 页面自带 canonical:在 head 中指向规范 URL,作为兜底信号;但 canonical 不等于重定向,能改链接的仍然优先改链接。
- Sitemap 只放规范地址:抓取入口里混入变体,等于主动把蜘蛛引向重复内容。
- 谨慎处理参数:确实没有内容价值的参数可以用 robots.txt 屏蔽或参数工具处理,但屏蔽前要确认它不会连带挡掉正常页面。
怎么确认收敛是否生效
比较实际的做法是定期把抓取日志按“内容”而不是按 URL 聚合,看同一份内容被访问的次数是否下降;再看一段时间内新增 URL 的抓取比例是否上升。如果变体访问量下降、新页面被抓得更快,说明收敛起了作用。
URL 变体不是致命问题,但它会让抓取预算和发现路径都变得模糊。先把同一份内容收敛成一个地址,再谈怎样让蜘蛛发现更多新 URL,顺序会更顺。
小结:URL 规范化的收益不会立刻显现,它更像是在给后续所有抓取工作腾出空间。地址收敛之后,内链、Sitemap、日志分析才有一个稳定的基础。