在蜘蛛池里,入口页被爬虫抓多少次、抓的是哪个地址,往往决定后面目标页能不能被顺带发现。很多池子本身配置没问题,问题出在 URL 上:同一个入口页,在访问记录里出现七八种写法,爬虫每次拿到的都是“新地址”,抓取信号自然就被摊薄了。
参数是怎么把入口页拆成多个地址的
URL 参数本质上是给服务器传的变量,但爬虫看到的是字符串。只要参数值不同,它就会当成不同的 URL。常见的来源有几类:
- 统计与追踪参数:utm_source、utm_medium、gclid、fbclid 等,多来自外链投放或复制粘贴。
- 会话类参数:sessionid、sid、token,动态生成,每次访问都可能变。
- 排序与筛选参数:page、sort、order、filter,列表页常见。
- 分页与展示参数:?p=2、?view=full、?print=1 之类。
- 大小写与末尾斜杠差异:/Page 和 /page、/a 和 /a/ 在部分服务器配置下会被当成不同地址。
参数为什么会消耗抓取预算
爬虫的抓取配额是有限的。同一个入口页被参数拆成十个地址,意味着至少要抓十次才能把内容看全,而这十次里内容可能完全一样。结果就是:真正需要被发现的目标页排到了后面,或者干脆没轮到。
更麻烦的是,如果入口页上的链接本身也带参数(比如从列表页直接复制出来的),爬虫顺着往下走,会继续生成一批带参数的二级地址,深度越走越散,越抓不到有用的页面。
先分清楚哪些参数可以留
不必一刀切地砍掉全部参数。可以按用途分三类处理:
- 不影响内容的参数:统计、会话、来源追踪。这类应尽量在入口页链接里去掉,或在服务器层面重写掉。
- 影响内容的参数:分页、分类、语言。这类可以保留,但要保证同一内容只有一种规范写法。
- 可默认的参数:sort=default、view=normal 这类默认值,最好不出现在链接里。
几种常见的处理方式
统一书写规则。入口页内部链接全部使用规范化后的地址:统一小写、统一带或不带末尾斜杠、不携带统计参数。外部引来的带参地址,靠服务器 301 跳到规范地址即可。
用 canonical 兜底。带参页面如果无法避免存在,就在页面里把 canonical 指向规范地址。注意 canonical 要指向真实可访问、返回 200 的地址,指向重定向链中间环节等于把信号丢掉。
用 robots 规则或参数处理工具收敛。对确定无用的参数(如 sessionid、print),可以在 robots.txt 里用通配符禁止抓取,或在搜索平台后台设置参数忽略规则。前者是阻止抓取,后者是让平台合并处理,二者目的不同,不要混用,也不要写得过宽而误伤入口页本身。
入口页尽量直链。把入口页链接直接写成不带参的静态地址,比依赖 URL 重写更稳。批量生成入口页时,模板里的链接最好由程序统一拼接,避免手工复制带来的参数残留。
上线前可以做的自检
- 随机抽 20 个入口页,看页面上指向目标页的链接是否带统计参数。
- 检查是否存在同一路径的大小写混用、末尾斜杠混用。
- 看访问日志里,被爬虫抓取的 URL 有多少是带参数的重复访问。
- 确认 canonical 指向的地址能正常返回 200,且与 sitemap 中提交的地址一致。
- 确认 robots.txt 没有误伤入口页,尤其别把带参规则写得太宽。
参数治理的目标不是“让 URL 变好看”,而是让爬虫的每一次抓取都落在有内容、有链接的地址上。分散出来的重复抓取,本身就是一种浪费。
参数处理属于基础工程,做与不做不会立刻看到差别,但池子规模上来之后,它会直接影响入口页的有效抓取次数。定期抽查比一次性配置更可靠。