在服务器日志里翻蜘蛛的抓取记录,经常会看到同一批内容对应着一长串地址:带 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 屏蔽,或者把前端交互改成不改变地址的形式。不要一边屏蔽抓取、一边又在站内链过去,那会让蜘蛛反复撞墙。
怎么确认参数地址真的被大量抓取
几个可以直接看的信号:
- 服务器日志里带问号的请求占比,以及这些请求的返回码分布。
- 站点地图和抓取统计中,参数地址被发现的量与抓取频率。
- 站内搜索、筛选项被点开时,地址栏是否发生变化。
一个可执行的顺序
- 先把参数按类型列出来,区分“有内容”和“无内容”。
- 无内容的追踪类、会话类参数,从模板和链接里清掉。
- 有内容的筛选组合,评估搜索需求后决定保留、收拢还是屏蔽。
- 统一标准地址,让 canonical、内链、Sitemap 保持一致。
- 改完之后观察几周日志,看参数请求是否下降、核心页面回访是否变快。
参数本身不是问题,问题是它让同一份内容有了太多入口。把入口收敛到少数几个明确的地址上,蜘蛛的判断会简单很多,站点运营也更容易看清哪些页面真的在被抓。