常见问题

目标 URL 大小写、斜杠、端口写得不一致,搜索蜘蛛会当成多个页面抓取吗

蜘蛛池入口页里同一条目标 URL,写法稍有不同就可能被当成几条链接。主机名大小写、默认端口、尾部斜杠、查询参数顺序、URL 编码这几处最容易出岔子。本文说明搜索蜘蛛如何判断是不是同一个 URL,以及入口页链接该怎样统一写法,减少抓取额度被同一个页面反复消耗。

常见问题

目标 URL 大小写、斜杠、端口写得不一致,搜索蜘蛛会当成多个页面抓取吗

整理蜘蛛池入口页时,经常会看到同一个目标 URL 有好几种写法:有的带尾部斜杠,有的不带;有的把主机名首字母写成大写;有的把 80 端口明明白白写进地址里。在人看来这明显是同一个页面,但在搜索蜘蛛眼里不一定。搜索蜘蛛抓到链接后,会先对该地址做一轮规范化处理,处理完仍然对不上的,就会被当作另一条地址,单独排进抓取队列。

搜索蜘蛛是怎么判断两个 URL 是不是同一个的

大致会走这么几步:

  • 协议和主机名统一成小写,比如 HTTP://Example.com/ 会向 http://example.com/ 靠拢;
  • 解析相对路径,把 .././ 这类写法还原成完整路径;
  • 对部分默认端口做归一,比如 http 的 80、https 的 443;
  • 处理地址里的片段标识符,也就是 # 后面的部分,通常只影响页内定位,不构成新地址。

但规范化是有边界的。它不会替你做服务端的跳转统一,也不会自动判断尾部斜杠、查询参数顺序这类差异到底算不算同一个页面。换句话说,能归一的它会归,归一不了的差异就会保留下来。

入口页里最容易出岔子的几个写法

主机名大小写

域名本身大小写不敏感,搜索蜘蛛一般会按小写处理,这一处出问题的概率相对低,但仍然建议入口页里统一写成小写,省得日志里两种形态混着出现、看统计时对不上号。

默认端口

:80 和不带,多数环节会归一,但中间只要有一层跳转或代理没处理干净,就可能留下两个版本。入口页里写链接时,默认端口干脆不要写。

尾部斜杠

这是最常见的一处。/a/a/ 在技术上是两个地址,除非服务端明确做了 301 统一。很多站点两种情况都能正常打开,返回的都是 200,于是搜索蜘蛛就把它们当成两条 URL 分别抓。入口页里混着写,等于把同一页面的抓取次数翻倍。

查询参数顺序

?a=1&b=2?b=2&a=1 在部分系统里会被视为不同地址。如果入口页是程序批量生成的,参数拼接顺序不稳定,就很容易产出大量实质相同的链接。

跟踪参数与 URL 编码

utm 一类的统计参数、会话参数,会让同一条目标 URL 派生出很多变体;编码层面,%7E 和 ~、中文的编码与未编码写法,也可能被解析成不同结果。入口页面向搜索蜘蛛,最好只保留必要的裸地址。

写法不一致会带来什么实际影响

  • 同一个页面被反复抓取,抓取额度被白白消耗,真正需要更新的页面反而排队更久;
  • 日志里出现多条相似记录,统计访问量、判断哪条 URL 被抓过时容易误判;
  • 入口页链接分散到多个变体上,你很难说清到底哪一条才是你希望被抓的那一条。

蜘蛛池入口页统一写法的做法

  1. 先给每条目标 URL 定一个规范形态,明确带不带尾部斜杠、带不带 www,然后写进入口页的生成规则里,不再手工临场发挥。
  2. 入口页里的链接尽量用统一格式输出,要么全部写绝对地址,要么全部写相对路径,不要两种混用,避免解析基准不一致。
  3. 在服务端做一层 301,把非规范形态永久指向规范形态,让搜索蜘蛛不管拿到哪种写法,最终都落到同一个地址上。
  4. 站点地图和主动提交的地址,只放规范形态。变体地址不要重复提交,否则等于自己给自己制造重复。
  5. 隔一段时间用日志或抓取工具核对一次,看看搜索蜘蛛实际抓的是哪几条地址,和你的预期是否一致。

已经乱了怎么收拾

如果入口页已经产生了大量变体链接,不用急着全删。先把日志按地址聚类,找出被抓次数最多、但内容相同的几条,判断哪一条是规范形态,再改入口页的生成规则,并在服务端补上跳转。已经散出去的旧链接不用刻意去动,让跳转慢慢把它们收拢过来即可。

规范化只解决“同一页面被当成多条地址”这一类问题,它减少的是重复抓取,并不等于页面会被收录,也不代表抓取频率会立刻变化。收录与否,还要看页面内容本身和站点整体情况。