做站的人大多遇到过这种情况:站点实际页面数量并不夸张,抓取日志里却能翻出成千上万条 URL,其中一大半是同一篇内容后面挂了一串问号参数。蜘蛛并不笨,它只是先按 URL 去抓。参数一多,等于给同一篇内容开了很多扇门,抓取量就这样被分掉了。
一个参数就是一条新 URL
对爬虫来说,URL 是页面的身份标识。只要查询串的键或值不同,它就只能当作不同的地址去访问。同一篇文章加上 ?utm_source=weibo、?from=share、?ref=pc,在日志里就是三条记录,抓取、渲染、入库的成本都要重复支付一次。
- 分享按钮自带的 utm 或 from 参数;
- 站内搜索、筛选、排序生成的查询串;
- 广告投放与联盟带来的落地页参数;
- A/B 测试、版本号、时间戳类的调试参数;
- 分页或文章列表里被顺手拼上的跟踪字段。
这些参数大多是给统计工具看的,对页面内容没有任何影响,但对抓取路径的影响很直接。
参数 URL 带来的三层影响
稀释抓取配额
蜘蛛在单位时间内愿意访问的 URL 数量是有限的。当同一批内容以数百种参数形态存在时,被访问的额度有相当一部分会消耗在重复页面上,真正需要更新的新页面反而排到了后面。
重复内容与信号分散
多个参数版本内容几乎一致,站内指向这些版本的链接也不统一,蜘蛛看到的是一组高度相似的页面,而不是一个明确的主版本。主版本的抓取频率、内链权重都会因此被摊薄。
路径变长,日志难读
参数还会带来链式跳转:带参页面指向另一个带参页面,链接越爬越散。日志被大量相似 URL 淹没之后,你很难判断哪些页面是真的被冷落了。
处理顺序:先收敛,再屏蔽,最后才谈提交
- 收敛来源。分享组件、广告落地页、站内推荐位统一去掉无意义的跟踪参数,或让参数只在统计脚本里读取,不写进链接地址。
- 固定规范版本。选一个不带参的 URL 作为主版本,页面上的 canonical 指向它,内链、Sitemap、面包屑也都只写干净地址。
- 区分有无价值的参数。筛选、分页这类会影响页面内容的参数,如果确定要参与索引,就给它稳定的规范地址;如果只是临时组合,考虑用 robots 或页面上的 noindex 处理。
- 最后再考虑屏蔽。robots.txt 里屏蔽参数并不等于 URL 不存在,蜘蛛仍可能从外链发现它,只是不抓取。若这些参数 URL 有外部链接,屏蔽会连带损失链接信号,需要按实际情况权衡。
要提醒的是,屏蔽是省事但粗糙的手段。它会让你同时失去对这批 URL 的抓取与观察,日志里只剩“已发现未抓取”,排查时反而缺少线索。能用规范 URL 解决的部分,尽量不用屏蔽来解决。
把规范版本固定成默认写法
真正有效的做法是让干净 URL 成为站内默认写法:导航、正文内链、相关推荐、分页组件、Sitemap 全部输出无参地址;统计参数交给前端脚本或统计平台自动识别,不再拼进 href。这样蜘蛛从任何入口进站,看到的都是同一套地址,重复抓取自然减少。
如果分页或筛选必须保留参数,至少让同一组条件只有一个可访问的地址,并让页面自身的 canonical 与内链保持一致,而不是让每一条筛选组合都变成独立入口。
用日志验证效果
- 统计日志中带问号 URL 的占比,看它是否在逐步下降;
- 检查参数 URL 的抓取频次,确认蜘蛛访问重心回到主版本;
- 对比处理前后被抓取 URL 的总数与去重后的数量;
- 观察新发布页面的首次抓取间隔是否缩短。
参数问题很少一次清干净,通常是一批改完,新模块上线又带进来一批。把“内链只写规范地址”当成上线检查项,比事后从日志里翻找要省力得多。