入口页的 URL 一旦带上参数,同一个页面对蜘蛛来说就变成了多个地址。池子本来就靠数量换发现机会,如果每个入口页都自带十几个变体,抓取预算很快会被这些重复地址吃掉。下面按参数类型拆开看。
参数制造的三种重复
- 纯状态参数:sessionid、sid、随机数、时间戳。它们只服务于访问状态,与内容无关,每次请求都可能不一样。
- 追踪参数:utm_source、from、ref、share 之类。用于统计来源,页面内容完全相同。
- 内容参数:page、cat、sort、filter 等。这类参数确实会改变页面上展示的内容集合。
前两类是纯粹的重复,第三类要看实现方式。不少站点用同一个模板渲染不同排序结果,本质上还是同一批链接,只是顺序变了。
该清理的参数
与内容无关的参数应尽量不出现在入口页的链接里。做法分两层:链接层面不生成,服务器层面做归一。
- 站内所有指向入口页的链接,统一使用无参数或固定参数的地址。
- 对带追踪参数、会话参数的访问,返回 301 跳到干净地址。
- 参数顺序固定,值做小写化、去空格处理,避免 a=1&b=2 与 b=2&a=1 被视为两个页面。
- 会随请求变化的随机数,尽量改成服务端生成一次、长期复用。
参数归一的目标不是讨好某一个搜索引擎,而是让同一份内容只有一个稳定地址,减少池子里的无效地址。
该保留的参数
分页、分类、筛选这类会真正改变内容集合的参数,不必强行去掉,但要控制组合数量。两三个筛选条件、每个条件取几个值,组合数就会暴涨。建议只给蜘蛛保留一条主路径,其余组合用 robots.txt 屏蔽,或在页面上用 canonical 指回主路径。
静态化的取舍
把带参数的地址改写成 /list/page-2/ 这类路径,好处是地址稳定、便于统计;代价是规则写错容易出现循环或死链。改造时先在测试环境把重写规则跑一遍,确认 301 链路只有一跳。
canonical 不能当万能药
canonical 是提示而不是指令,蜘蛛可能忽略。参数地址如果本身还能正常访问并返回内容,仍然可能被单独抓取。更彻底的做法是让带参数的地址返回 301,或者干脆不生成这样的链接。
自查清单
- 抓取日志里同一路径出现大量不同参数版本,说明归一没做干净。
- 随机数、时间戳出现在入口页 HTML 中,优先处理。
- 站内链接与 sitemap 中的地址写法是否一致。
- 分页参数是否可被无限组合,机器生成的分页链接要设上限。
- 重定向链是否超过一跳,链路过长会持续消耗抓取配额。
参数处理的收益不会立刻体现在蜘蛛数量上,但能减少池子里的无效地址,让有限的抓取预算落在真正需要被发现的 URL 上。池子越大,这件事越值得先做。