入口页本身结构简单,出问题的地方往往不在页面内容,而在地址。同一条入口页 URL 后面挂上不同参数,蜘蛛看到的可能就是几十个“不同”的地址,抓取预算被摊薄,真正的主版本反而不容易被识别。这篇文章只讲参数这一件事:它从哪来、怎么收敛、怎么判断有没有收敛成功。
参数是怎么把一条入口页变成多条地址的
蜘蛛判断页面是否相同,主要看 URL 本身。只要参数键值对不一样,它默认就是另一个地址,需要重新抓一遍。哪怕返回的内容完全一致,它也不会自动帮你合并。
常见的参数来源大致有几类:
- 统计与追踪参数:utm_source、from、ref 之类,通常由站外链接或投放渠道带进来。
- 会话类参数:sessionid、sid、token,一旦出现在 URL 上,同一条入口页每次访问都是新地址。
- 功能类参数:排序(sort、order)、筛选(filter)、分页(page)、视图切换(view=list)。
- 程序自动拼接:模板里写死的 ?v=1、?t=时间戳,页面本身没用到,但地址上一直带着。
前两类基本没有保留价值,后两类要分情况看:排序和筛选如果内容确实不同,属于正常页面;如果只是同一批内容换了排列顺序,长期留在索引里意义不大。
规范化处理:先定主版本,再决定其余地址的出路
不管用哪种手段,前提都是先明确一条入口页的唯一主地址,再把其他变体当成它的副本处理。
1. 在页面上声明 canonical
在 head 里放 rel="canonical",指向不带多余参数的主地址。这是最温和的做法,不阻断抓取,只是传递“谁才是主版本”的信号。注意 canonical 要指向同一条入口页的干净地址,而不是指向目标页——指向目标页等于告诉蜘蛛这条入口页是别人的副本,入口页本身就没有存在必要了。
2. 用 robots 或服务端规则挡住无意义参数
会话 ID、纯统计参数这类,可以在 robots.txt 里按参数模式屏蔽,或者在服务端直接拒绝带这些参数的请求。前提是这些参数对真实用户也没有用。如果站内链接本身就会带上它们,先改链接,再谈屏蔽。
3. 需要合并时用 301
当多条地址已经各自被收录、内容又完全一样,可以考虑 301 到主地址。但要清楚这是相对不可逆的动作:跳转链条不宜过长,也不要让跳转目标本身又带参数,否则等于原地打转。
4. 从源头统一站内链接
入口页之间的互链、模板里的导航、页脚链接,都尽量指向不带多余参数的地址。站内链接是蜘蛛发现地址的主要入口,这里带参数,前面的规范化和屏蔽都会打折扣。
怎么验证参数已经收敛
- 先从访问日志里筛出带问号的请求,按参数名归类,看看哪些参数出现频率最高。
- 挑几个高频参数地址,和主地址对比页面标题、正文首段、主要链接,确认内容是否真的相同。
- 持续观察一段时间日志,看同一参数地址的抓取次数是否下降、主地址的抓取是否更集中。
- 在搜索端的站点工具里查看已发现地址数量与收录情况,作为辅助参考,不作为唯一依据。
这一步的目的不是追求“地址数越少越好”,而是确认蜘蛛把抓取集中在真正有价值的入口页上。
几个容易踩的坑
- 一刀切屏蔽所有参数:分页、筛选这类参数被一起挡掉后,正常内容也跟着无法被抓取。
- canonical 和 301 同时用且指向不一致:页面声明一个主地址,服务器又跳到另一个,信号互相冲突。
- 用 JS 在加载后改地址:蜘蛛看到的往往是原始 URL,改地址对多数抓取行为没有帮助,反而增加排查难度。
- 只改模板不改历史链接:老页面里遗留的参数链接还在被爬,收敛效果会慢很多。
参数处理没有统一答案,判断标准只有一条:这条地址对用户和蜘蛛是否有独立价值。有,就保留并做好内容;没有,就统一到主地址上。
建议先用小批量入口页试一遍:加上 canonical、清理站内链接、观察两周日志。确认主地址抓取占比上升、重复地址请求下降后,再推到全量。参数治理是持续动作,新功能上线、投放换渠道都可能带回新参数,定期看日志比一次性大改更实在。