一个页面为什么会变成几十个地址
URL 膨胀往往不是从外链开始的,而是从自己页面里的链接开始的。列表页的「按价格排序」、文章底部的分享链接、投放落地页带的 UTM 参数,只要被写进 HTML,蜘蛛就会把它们当成新的地址排队。同一个商品页,可能因为 ?sort=price、?from=weibo、?sid=abc123 这几个后缀,在抓取队列里出现十几个版本。
这些变体页面内容大同小异,蜘蛛抓到之后要么判定重复,要么反复确认两者之间的关系。无论哪种结果,消耗的都是同一份抓取时间。
三类参数,处理顺序不一样
追踪参数:最该先清掉
utm_source、from、ref、spm 这类参数只服务于统计,对页面内容没有任何影响。它们最好在链接输出阶段就不要出现。统计需求可以由脚本在点击时上报,不必通过改写链接来实现。
排序与筛选:保留少量可控入口
排序和筛选参数确实能产生有价值的页面组合,但组合数量是乘法级的。可以先确认哪些组合有真实搜索需求,把这几组做成可抓取的静态入口,其余组合通过 robots.txt 或参数屏蔽规则收口。
会话与身份参数:从源头避免
sid、sessionid、token 这类参数会让同一个 URL 对每个访客都不同。蜘蛛每次抓到的都像是「新地址」,缓存和去重都失去意义。这类信息应改为 Cookie 或请求头传递,不要出现在链接里。
内链是第一道关
参数治理最省力的位置是模板层。检查一遍站点模板,通常能找到大部分问题来源:
- 分享组件自动附加的来源参数;
- 分页链接里带的时间戳或随机数;
- 面包屑、相关推荐里拼接的追踪参数;
- 站内搜索结果的链接被直接输出到页面上。
把这些位置改成干净链接,比事后写规则去拦截要可靠得多。规则是补丁,链接输出才是源头。
robots.txt 和 canonical 的分工
如果短期内改不完模板,可以用 robots.txt 挡住参数型 URL。多数主流蜘蛛支持通配符写法,但要小心别把正常页面一起挡住,比如规则写得过宽,可能连带参数的正规内容页也一起屏蔽了。
canonical 的作用不同:它不阻止抓取,只表明「这个变体属于哪个主版本」。适合用在参数确实需要保留、且希望把权重归并的情况。
把 robots.txt 当成屏蔽、canonical 当成归并,两者不要互相替代。被 robots.txt 挡住的 URL,蜘蛛通常不会去读它页面里的 canonical。
用日志确认收口效果
规则上线不等于生效,回到服务器日志里看才踏实。可以按下面几步核对:
- 筛选出带问号的请求,统计参数种类和请求量占比;
- 观察同一路径下不同参数版本各被请求了多少次;
- 对比收口前后,蜘蛛在有效页面上的请求量有没有变化;
- 留意是否出现新的参数组合,说明还有没被清理的链接出口。
一个可以照着走的顺序
先清模板里的追踪参数,再把筛选组合收敛到少数可控入口,然后用 robots.txt 挡住剩余的参数型 URL,最后用 canonical 处理必须保留的变体,并回到日志验证。整个过程不必一次性做完,但顺序尽量不要颠倒——先改链接输出的收益,通常比后面几条规则加起来都大。