蜘蛛是按 URL 记账的。同一个页面,只要能用两种写法访问,在抓取队列里就是两条记录:各自排队、各自占用预算、各自回传一份内容几乎相同的 HTML。很多站点觉得抓取量不少,但真正需要更新的页面却迟迟不刷新,问题常常出在这里。
同一个页面常见的几种写法
下面这些差异,人眼看不出来,对 URL 来说却是两个不同的地址:
- 协议:http 与 https 各自算一条 URL。
- 主机名:example.com 与 www.example.com 是两条 URL。
- 大小写:/About 与 /about 在多数服务器上是两个路径。
- 结尾斜杠:/list 与 /list/ 是否算同一页,取决于服务器配置。
- 默认文件名:/index.html、/index.php 与目录根。
- 参数:排序、分页、来源追踪参数的顺序与有无。
单看每一条都不算什么,叠在一起,一个页面可能生出七八个可访问地址。
抓取量是怎么被分掉的
抓取队列里排的是 URL,不是“页面”。当同一份内容有多个地址,通常会发生三件事:
- 多个 URL 争夺同一份抓取额度,每个都抓得少、更新慢;
- 内链如果指向不同写法,链接信号被拆到几个地址上;
- 日志里抓取次数看着不少,按路径去重之后有效页面却不多。
这不一定会立刻带来排名问题,但它会让该被重新抓取的页面排在更后面。
收敛的四步
选定一个规范地址
确定唯一的协议、主机名与路径写法,其余写法一律 301 到它。301 是服务器端动作,比页面里的 canonical 更确定。
内链只写规范地址
导航、面包屑、正文链接、分页链接统一指向同一写法。内链是蜘蛛发现 URL 的主要入口,入口写成什么样,它就记成什么样。
Sitemap 只放规范 URL
Sitemap 是“希望被抓的地址清单”。把变体写进去,等于主动请蜘蛛去抓重复内容。
canonical 用来兜底
canonical 是提示而非指令。当 301 不便实施(例如参数页需要保留)时用它补充,但不要拿它替代 301。
容易被忽略的几个角落
- 站内搜索、筛选、排序生成的参数链接,是否有对应处理;
- 分享、广告、邮件里的追踪参数,落地页会不会被记成新地址;
- 历史链接里的大小写混用,服务器是否统一;
- CDN 回源时 Host 是否归一,避免同一内容在两套主机名上都可访问。
怎么验证
从日志里按路径去重再看一遍抓取分布:把协议、大小写、斜杠归一之后,统计每个路径被访问的次数。如果归一后的次数明显低于归一前的总和,说明变体确实在分走抓取量。归一之后如果某个路径仍长期不被访问,那更可能是内链或 Sitemap 上的入口问题,而不是 URL 写法问题。
抓取额度不会因为多写了几个地址而变大,只会被摊薄。
URL 写法的统一是一件偏底层的事,不做也不会立刻出问题,但它决定了后续的抓取效率是否被无谓消耗。先把地址收敛干净,再谈抓什么、什么时候抓,会省下不少功夫。