搜索抓取

canonical 之外:重复 URL 为什么还在被蜘蛛抓

不少站点已经给重复地址加了 canonical,日志里却仍能看到大写地址、参数页、旧域名被反复抓取。抓取发生在合并之前,canonical 只能减少索引混乱,挡不住请求。本文拆解重复 URL 的常见来源,并给出从内链、Sitemap、301 到 robots.txt 的收口顺序。

搜索抓取

canonical 之外:重复 URL 为什么还在被蜘蛛抓

站点做了 canonical,日志里还是能看到带参数的地址、大写地址、旧域名被反复抓取。这通常不是蜘蛛没看懂标签,而是抓取和索引本来就不是同一件事:只要一个 URL 被链接、被 Sitemap 列出、被历史记录记住,它就有机会进入抓取队列,canonical 一般在这一步之后才起作用。

重复 URL 一般从哪几个口子冒出来

先把来源分清楚,比一上来就加标签更有效。

  • 参数:排序、筛选、追踪用的 utm、会话 ID、分页参数。
  • 同一地址的不同写法:大小写、结尾斜杠、默认端口、www 与非 www。
  • 内容副本:打印页、移动版、AMP、旧域名、http 与 https。
  • 程序生成:站内搜索结果页、标签聚合页、日历页。

这些 URL 有的是被内链带出来的,有的是外链残留,有的干脆来自 Sitemap 自己写错。

canonical 管的是合并,不是拦截

canonical 告诉蜘蛛“这一组里以哪个为准”,但它不阻止抓取。蜘蛛发现 URL、抓取、渲染,再判断是否需要合并,顺序上抓取在前。也就是说:重复 URL 被大量抓取时,真正被消耗的是抓取预算和服务器资源,canonical 只能减少后续的索引混乱,减不掉前面的请求数。

另一个容易忽略的点是:被抓不等于被索引,但“未被索引的抓取”依然占用带宽、CPU 和蜘蛛的时间片。对中小站点来说,这部分浪费往往比想象中大。

收口要从“少被发现”开始

减少重复 URL 被抓,重点是管住它们的发现路径,而不是事后贴标签。

  • 内链统一指向规范版本:导航、面包屑、列表页、正文链接都指向同一种写法。
  • Sitemap 只放规范 URL:Sitemap 是主动提交入口,写错等于邀请蜘蛛来抓重复地址。
  • 能 301 的就 301:真正的旧地址、多域名、http 到 https,用跳转比 canonical 更直接。
  • robots.txt 留给无价值参数:如站内搜索、会话参数。注意被屏蔽的页面无法再通过 canonical 传递信号,只适合确实不需要参与索引的地址。
  • hreflang 与 canonical 保持一致:多语言站点里两个标注指向不同 URL,最容易让蜘蛛来回抓。

有一种情况值得单独提:站内搜索页和带排序参数的列表页。它们内容随查询变化,蜘蛛很容易顺着一个输入框或一个排序链接进入数量近乎无限的 URL。这类地址除了在 robots.txt 里屏蔽参数目录,页面上的入口也尽量改成表单提交或按钮,而不是可爬取的 a 标签。

怎么确认收口有没有生效

看三处:服务器日志里重复地址的抓取次数是否下降;Search Console 的“重复网页,用户未选定规范网页”是否减少;“已发现 - 尚未编入索引”的数量是否回落。判断周期要给够,改完内链和 Sitemap 后,蜘蛛重新走一遍通常需要数周时间。

一个常见的执行顺序

  1. 从日志里列出被抓次数最多的前几十个 URL,去掉参数看真实路径。
  2. 逐个判断:保留、合并,还是彻底不要。
  3. 合并的做 301,不要的用 robots.txt 挡,保留的写进 Sitemap。
  4. 全站内链换成规范写法,包括页脚和侧栏里那些长期被忽略的链接。
  5. 过一段时间再比对日志,确认抓取集中到了有价值的页面上。
canonical 解决“哪一个是正本”,301 和 robots.txt 解决“会不会被请求”。把这两件事分开做,重复 URL 的抓取量才会真正降下来。