做蜘蛛池时,很多人习惯在入口页的目标链接后面加一串参数,比如 ?utm_source=pool1 或 ?from=entry05,用来区分流量来源。这样写本身没问题,但需要先清楚一件事:搜索蜘蛛看到的是 URL,不是你的统计意图。
带参数的 URL,在搜索蜘蛛眼里算不算新页面
从技术上讲,URL 不同就是不同资源,抓取系统会按不同地址分别请求。至于它最终会不会把两个变体当成同一个页面,取决于平台自己的参数处理规则,这类规则不公开,也不固定。常见可能出现三种结果:
- 识别为已知的跟踪参数,直接忽略或归一到无参版本;
- 保留参数分别抓取,但只选择一个版本进入索引;
- 完全当成两个独立 URL,分别抓取、分别处理。
你无法指定它走哪条路,只能通过日志和抓取结果去观察实际表现。
参数变体被单独抓取,会带来什么
- 抓取预算被切碎:同一个目标 URL 有五种参数写法,就可能是五倍请求量,而信息量几乎为零。
- 日志失真:路径统计看起来很热闹,去掉参数后,真正被覆盖的目标 URL 数量可能没变。
- 归因变模糊:不同入口页用不同参数指向同一个目标,很难判断到底是哪个入口页起了作用。
- 容易生成无限变体:参数里一旦带上时间戳、排序值、会话 ID,组合会越来越多。
哪些参数相对安全,哪些要小心
区分的核心在于:这个参数是否改变页面正文内容。
- utm_*、gclid、fbclid、spm 这类纯跟踪参数,被忽略的概率较大,但不保证。
- ?id=、?p=、?page=、?cat= 这类决定内容的参数,必须保留。
- 会话 ID、排序、筛选组合、时间戳,最容易制造大量低价值变体,应尽量避免写进静态链接。
怎么判断有没有被重复抓取
- 在服务器日志里,把同一目标路径的请求按 query string 分组,看带参与不带参的比例。
- 对比不同入口页指向的同一个目标 URL,是否出现了多种参数写法。
- 抽查几个目标 URL,确认被采用的版本是不是无参的那一个。
- 隔一段时间再看一次,观察变体数量是在收敛还是持续增加。
日志里出现大量带参请求,并不等于抓取效率高;有时恰好说明抓取预算被同一条路径的多个变体消耗掉了。
比较稳妥的做法
- 入口页里指向目标 URL 的链接,尽量写成无参形式,来源统计放在服务端日志或前端脚本里做。
- 如果确实需要参数区分来源,就固定参数顺序和写法,不要每次生成新的随机值。
- 存在带参版本时,用 canonical 指向无参版本,作为表达偏好的手段,它不是强制指令。
- 不要为了“省抓取”直接把参数路径写进 robots.txt 的 Disallow,那同时也切断了链接发现路径。
两个常见误区
- “加了 canonical 就一定不会重复抓取”:canonical 只是提示,抓取阶段仍可能对变体发起请求。
- “参数一定会被忽略,所以随便加”:忽略与否取决于平台规则,把关键链接建立在不确定的假设上并不划算。
在实际运营中,更值得关心的不是参数会不会被抓,而是每个参数变体背后指向的是不是同一个目标 URL。如果是,参数带来的往往只是额外的请求量,而不是额外的覆盖范围。定期比对日志里的路径分布,比纠结平台规则更有效。