搜索抓取

参数化 URL 的抓取代价:同一份内容为什么会有多个地址

站内排序、筛选和追踪参数会让同一批内容对应多个地址,蜘蛛需要逐个抓取、逐个去重。本文梳理参数如何造成地址膨胀、它对抓取预算的影响,以及用 canonical、robots.txt、内链清理和筛选页取舍来收敛地址的具体做法。

搜索抓取

参数化 URL 的抓取代价:同一份内容为什么会有多个地址

在服务器日志里翻蜘蛛的抓取记录,经常会看到同一批内容对应着一长串地址:带 sort 的、带 filter 的、带 utm 的、带 sessionid 的。它们在蜘蛛眼里不是“同一个页面的变体”,而是各自独立的 URL,各自要排队、各自要抓一次。

参数是怎么把地址拆开的

一个典型的列表页,只要开放了排序和筛选,地址数量就会随着可选维度的组合快速膨胀。常见的参数类型包括:

  • 排序类:sort=price、order=desc,同一批内容换个顺序就变成一个“新地址”。
  • 筛选类:品牌、价格区间、颜色,两两组合就能生成几十上百个地址。
  • 追踪类:utm_source、from、ref,本来是给统计工具看的,对页面内容没有任何影响。
  • 会话类:早期站点常见的 sessionid、sid,每个访客生成的地址都不一样。

其中只有筛选类可能承载真实的、有搜索需求的内容,其余几类基本属于纯粹的地址膨胀。

为什么这会让蜘蛛做大量无用功

蜘蛛的去重通常发生在抓取之后,也就是说,它得先把页面拉回来,才能判断内容是不是已经见过。这意味着:

  • 每个参数组合都会消耗一次抓取配额,挤占真正需要更新的页面。
  • 新发现的大量地址会进入抓取队列,把老页面的回访周期拉长。
  • 同一批内容被反复抓取,服务器端的开销和带宽也跟着上去。

对小站来说,抓取预算本来就有限,被参数吃掉一部分之后,新发布的内容可能要等更久才被发现。

几种收敛办法,以及各自的边界

canonical 指向标准地址

可以在带参数的页面上加 canonical,指向不带参数的版本。它表达的是“这几个地址代表同一份内容”。需要注意的是,canonical 是建议而非强制,蜘蛛仍然可能出于其他原因去抓参数地址,但它在合并信号时是有价值的。

robots.txt 里处理参数

对于纯追踪参数,可以在 robots.txt 里用通配符屏蔽,例如 Disallow: /*?utm_ 这类规则,能减少一部分无效抓取。但要小心:robots.txt 屏蔽的是抓取,不是索引。如果被屏蔽的地址在别处有外链,它仍可能以缺少描述的形式出现在结果里。所以只对确定没有内容的参数使用。

内链里不要带无意义参数

很多参数地址其实是站内链接自己带出来的:导航、面包屑、列表页里的“下一页”如果拼上了追踪参数,就等于在每个页面上主动告诉蜘蛛“这里还有一个新地址”。清理模板里的这类拼接,往往比事后屏蔽更有效。

把参数收敛当成链接规范的一部分来看,比单独去处理某几个地址更省事。

筛选页面的取舍

筛选组合如果确实有搜索需求,可以考虑保留一部分,其余用 noindex 或 canonical 收拢;如果没有需求,直接用 robots.txt 屏蔽,或者把前端交互改成不改变地址的形式。不要一边屏蔽抓取、一边又在站内链过去,那会让蜘蛛反复撞墙。

怎么确认参数地址真的被大量抓取

几个可以直接看的信号:

  • 服务器日志里带问号的请求占比,以及这些请求的返回码分布。
  • 站点地图和抓取统计中,参数地址被发现的量与抓取频率。
  • 站内搜索、筛选项被点开时,地址栏是否发生变化。

一个可执行的顺序

  1. 先把参数按类型列出来,区分“有内容”和“无内容”。
  2. 无内容的追踪类、会话类参数,从模板和链接里清掉。
  3. 有内容的筛选组合,评估搜索需求后决定保留、收拢还是屏蔽。
  4. 统一标准地址,让 canonical、内链、Sitemap 保持一致。
  5. 改完之后观察几周日志,看参数请求是否下降、核心页面回访是否变快。

参数本身不是问题,问题是它让同一份内容有了太多入口。把入口收敛到少数几个明确的地址上,蜘蛛的判断会简单很多,站点运营也更容易看清哪些页面真的在被抓。