站内的筛选、排序、分页和追踪参数,是最容易在短时间内把 URL 数量翻好几倍的来源。一个商品列表加上颜色、尺码、价格区间,再叠加排序方式和来源标记,组合出来的地址可能成千上万。这些地址大多返回 200,页面内容也大同小异。如果放任不管,爬虫会把大量抓取额度花在近似页面上,真正需要被发现的页面反而排到后面。
先判断参数改变的是内容还是视图
处理参数之前先问一个问题:这个参数有没有带来新的、对用户有意义的正文内容。
- 筛选参数:颜色、尺码、价格区间这类,通常是同一批内容的子集,页面主体高度重合。
- 排序参数:按价格、按销量,改变的是排列顺序,内容集合基本不变。
- 追踪参数:utm、来源标记、分享 ID,对页面内容没有任何影响。
- 分页参数:翻到第二页之后确实是不一样的内容片段,需要单独判断。
通常只有筛选和分页可能承载独立内容,排序和追踪参数基本可以判定为视图状态,不太需要单独产生一个索引版本。
抓取和收录是两件事
很多人把“别收录”直接等同于“别抓取”,于是用 robots.txt 一刀切掉所有带参数的地址。这样做的副作用是:爬虫再也无法通过这些链接发现页面里的其他 URL,内链结构被切断。更稳妥的做法是分层处理。
- 追踪参数:在服务器层做规范化,301 到不带参数的干净地址,让爬虫只看到一个版本。
- 排序参数:保留可访问,但在页面 head 里用 canonical 指向默认排序版本。
- 筛选参数:组合过多时,允许抓取但不主动暴露入口,避免在站点地图和内链里批量输出。
- 分页参数:保留可抓取,让爬虫能沿着链接走到更深的详情页。
容易踩的几个坑
canonical 写成相对路径或指向了错的地方
canonical 最好指向一个可访问、返回 200 的绝对地址。如果目标地址本身被 robots.txt 屏蔽,或者会跳转到别处,这个信号大概率会被忽略,参数版本仍可能被单独索引。
筛选链接靠脚本拼出来,入口却全量输出
页面上的筛选入口可能是给用户点的,但服务端 HTML 里如果已经把大量组合写进了 href,爬虫照样会发现它们。想控制发现范围,就要从链接输出这一层入手,而不是指望 canonical 兜底。
同一种筛选存在多种参数顺序
?color=red&size=42 和 ?size=42&color=red 是两个不同地址但同一内容。服务器如果不能归一化参数顺序,就会凭空多出一倍 URL。可以在网关或应用层对参数排序后统一跳转。
判断标准可以简单一点:这个参数地址,用户会主动分享、搜索或收藏吗?如果不会,它大概率不需要独立索引。
一份可执行的自查清单
- 用日志或抓取记录统计带参数 URL 占被请求总量的比例。
- 把参数按筛选、排序、追踪、分页四类打标,分别决定策略。
- 检查 canonical 是否指向 200 状态、未被屏蔽的绝对地址。
- 检查站点地图和内链里是否混入了大量低价值参数地址。
- 处理完之后隔一段时间再回看抓取分布,确认额度是否向内容页转移。
参数 URL 的处理没有一劳永逸的开关,更多是分类、取舍和持续观察。先把参数按用途分清,再决定哪些让它被看见、哪些只保留可访问,通常比全站一刀切更稳。