蜘蛛发现一个 URL 后,通常不会先判断“这个页面我是不是已经抓过”,而是把 URL 当作唯一标识放进待抓队列。只要地址字符串不同,它就可能当成新页面再抓一次。同一篇内容如果存在多个地址,重复抓取就会消耗抓取预算,也会让页面信号变得分散。
同一内容为什么会出现多个 URL
常见差异不一定是有人故意制造,很多是技术配置自然产生的:
- 大小写不同:/Article/123 和 /article/123 在蜘蛛眼里是两个 URL。
- 末尾斜杠有无:/page 与 /page/ 可能被分别抓取。
- 协议与主机名:http 与 https、www 与非 www、带端口与不带端口。
- 参数顺序或跟踪参数:?a=1&b=2 与 ?b=2&a=1,以及 utm、ref、session 等。
- 分页、排序、筛选参数:同一列表页因参数组合生成大量地址。
- 打印页、AMP、移动版等独立地址。
这些地址如果都返回 200,且没有明确信号告诉蜘蛛“哪个是主地址”,蜘蛛就可能多次来访。
蜘蛛如何判断该抓哪个地址
蜘蛛主要依赖几个信号:
- 301 跳转:把旧地址永久指向新地址,抓取路径会在第一跳后收口。
- canonical:在页面头部声明规范地址,告诉蜘蛛这一组地址中哪个是主版本。
- Sitemap:只提交规范地址,减少蜘蛛从清单里发现重复 URL 的机会。
- 内链锚点:站内链接尽量指向主地址,不要让同一内容在导航里出现多个版本。
需要注意的是,canonical 是提示,不是强制命令;301 更明确,但只适合地址真正迁移的场景。两者如果互相矛盾,蜘蛛会重新判断,收口效果反而变差。
用 canonical 和 301 把地址收口
如果是协议、域名、路径结构变化,优先用 301。比如全站从 http 迁到 https,或从带 www 统一到不带 www,应让旧地址整站跳转到新地址,而不是只在部分页面加 canonical。
如果是同一页面因参数、打印版、排序方式产生多个地址,更适合用 canonical。规范地址应当是自己返回 200、可正常抓取、内容完整的版本。不要把 canonical 指向一个 404、重定向或 noindex 的页面。
一个常见误区:把带参数的筛选页全部 canonical 到无参数列表页。如果筛选页有独立搜索价值,这样可能让蜘蛛不再抓取筛选内容;如果筛选页只是组合参数,则可以考虑用 robots 或参数处理规则收口。
Sitemap 与内链只保留主地址
Sitemap 是地址清单,不是越多越好。把同一内容的多个版本都写进 Sitemap,等于主动告诉蜘蛛有更多 URL 需要抓。更稳妥的做法是:
- Sitemap 只放规范 URL,并保持与页面 canonical 一致。
- 站内导航、面包屑、相关推荐等链接,统一指向规范地址。
- 分页、筛选、排序等参数地址,按实际需要决定是否进入 Sitemap。
- 跟踪参数尽量在生成链接时去除,不要等蜘蛛抓到后再处理。
怎么检查重复抓取有没有减少
可以结合服务器日志和抓取工具观察:
- 日志中同一路径带不同参数、大小写、斜杠的访问量是否下降。
- 抓取工具请求主地址时,返回的 canonical 是否指向自己。
- Sitemap 中的 URL 与页面 canonical 是否大面积一致。
- 带参数 URL 的抓取频次是否仍然很高,如果高,检查内链或 JS 是否在大量生成参数链接。
URL 归一化不是一次性配置。改版、上新功能、加统计参数都可能重新产生重复地址。把 canonical、301、Sitemap 和内链当作一套持续维护的规则,蜘蛛的抓取路径会更干净,抓取预算也更可能用在真正需要更新的页面上。