蜘蛛池知识

蜘蛛池入口页的 URL 参数处理:同一条页面为什么会被反复抓取

入口页挂上一串参数后,同一份内容可能对应多个地址,蜘蛛分不清主版本,抓取节奏也容易被拖散。本文从参数来源、规范化手段、日志验证三方面说明入口页 URL 参数该怎么收敛,以及哪些做法容易误伤正常页面。

蜘蛛池知识

蜘蛛池入口页的 URL 参数处理:同一条页面为什么会被反复抓取

入口页本身结构简单,出问题的地方往往不在页面内容,而在地址。同一条入口页 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. 从源头统一站内链接

入口页之间的互链、模板里的导航、页脚链接,都尽量指向不带多余参数的地址。站内链接是蜘蛛发现地址的主要入口,这里带参数,前面的规范化和屏蔽都会打折扣。

怎么验证参数已经收敛

  1. 先从访问日志里筛出带问号的请求,按参数名归类,看看哪些参数出现频率最高。
  2. 挑几个高频参数地址,和主地址对比页面标题、正文首段、主要链接,确认内容是否真的相同。
  3. 持续观察一段时间日志,看同一参数地址的抓取次数是否下降、主地址的抓取是否更集中。
  4. 在搜索端的站点工具里查看已发现地址数量与收录情况,作为辅助参考,不作为唯一依据。

这一步的目的不是追求“地址数越少越好”,而是确认蜘蛛把抓取集中在真正有价值的入口页上。

几个容易踩的坑

  • 一刀切屏蔽所有参数:分页、筛选这类参数被一起挡掉后,正常内容也跟着无法被抓取。
  • canonical 和 301 同时用且指向不一致:页面声明一个主地址,服务器又跳到另一个,信号互相冲突。
  • 用 JS 在加载后改地址:蜘蛛看到的往往是原始 URL,改地址对多数抓取行为没有帮助,反而增加排查难度。
  • 只改模板不改历史链接:老页面里遗留的参数链接还在被爬,收敛效果会慢很多。
参数处理没有统一答案,判断标准只有一条:这条地址对用户和蜘蛛是否有独立价值。有,就保留并做好内容;没有,就统一到主地址上。

建议先用小批量入口页试一遍:加上 canonical、清理站内链接、观察两周日志。确认主地址抓取占比上升、重复地址请求下降后,再推到全量。参数治理是持续动作,新功能上线、投放换渠道都可能带回新参数,定期看日志比一次性大改更实在。