在蜘蛛池里,入口页上挂着同一个目标页的好几种 URL 写法,是很常见的事。有人甚至觉得这样等于多推了几次。实际上蜘蛛并不会这么理解:对它来说,这几种写法要么是同一个页面,要么是几个内容高度相似、需要逐一去确认的页面,两种情况都要花掉抓取次数。
本文只谈一件事:蜘蛛池入口页的 URL 归一化。它不复杂,核心就是把同一个页面只用一种写法这件事做扎实。
重复 URL 一般从哪来
先看来源。蜘蛛池的入口页大多靠程序批量生成,URL 到底唯不唯一,取决于生成规则写得细不细。常见的重复来源有这几类:
- 大小写不一致:/Page/1 与 /page/1 在多数服务器上等价,但蜘蛛按字面区分。
- 尾斜杠:/abc 与 /abc/ 经常都能返回正常页面。
- 协议与主机名:http 与 https、带 www 与不带 www,如果没做跳转,就是四份 URL。
- 默认文件名:/index.php、/index.html 与根目录 / 往往指向同一个页面。
- 查询参数:utm_source、from、ref、随机 id 之类的参数,每换一次就是一个新 URL。
- 分页参数:?page=1 与不带参数的第一页。
- 链接里锚点写法与参数值大小写混杂。
这些问题在普通站点上也会出现,但蜘蛛池的入口页量大、更新频繁,一旦规则没写死,重复会被成倍放大。
重复抓取的代价不只是浪费
最常被提到的代价是抓取预算。蜘蛛对一个站点的抓取总量在一段时间内大致存在上限,重复 URL 越多,真正需要被发现的页面能分到的次数就越少。这一点在入口页数量多、目标页也多的时候尤其明显。
除此之外还有两个更隐蔽的代价:
- 日志失真:同一条请求在日志里分散成好几种路径,统计某个入口页被蜘蛛访问了几次时会偏低或偏高,判断池子有没有起作用就失去了依据。
- 页面价值判断受影响:如果一个入口页只有链接、几乎没有内容,而它又被蜘蛛以多种 URL 反复抓取,容易被看成低价值的重复页,进而影响后续的抓取频率。
把重复 URL 理解成多一次曝光是一种错觉。多出来的那几次抓取不会转化成额外的发现机会,只是把同样的工作重复做了一遍。
归一化的几个基本动作
先把内部链接写统一
入口页上指向目标页的链接,写法必须统一:统一用小写、统一用绝对路径、统一带或不带 www、统一带或不带尾斜杠。批量生成的时候,这些规则最好写进模板里,而不是靠后期手工修。
用 301 把变体收拢
如果同一页面已经可以从多个地址访问,用 301 把变体统一跳到规范地址。301 的语义是永久的,蜘蛛在多次遇到后通常会记住规范地址,后续抓取以它为准。相比之下,302 容易被理解为临时跳转,收拢效果不如 301 稳定。
用 canonical 作为补充
对于 URL 结构本身不方便改的情况,比如带有业务参数的页面,可以在页面头部加 canonical,指向规范地址。canonical 是建议而不是强制,所以它更适合当作补充手段,而不是替代内部链接统一。
蜘蛛池场景下的几个注意点
- 目标页的规范 URL 最好只有一份,并在推送时固定使用它。
- 入口页的链接列表尽量别带追踪参数。需要统计的话在服务端记录,不要写进 URL。
- 分页的第一页统一使用不带参数的形式,避免 ?page=1 与根路径并存。
- 如果入口页本身也是批量生成的,注意生成规则不要产出参数互不相同、内容却完全一样的页面。
- 站点地图、其他入口页里出现的同一个页面,写法也要保持一致。
怎么自查有没有问题
- 从访问日志里按路径去重,看看同一个页面被访问过的不同写法有多少种。
- 对比日志里的总请求数和去重后的页面数,差距越大,说明重复越严重。
- 挑一个目标页,在入口页里搜索它的链接,看看一共出现了几种写法。
- 把发现的变体逐一用 301 或统一链接处理掉,再观察一段时间日志。
归一化不会让蜘蛛突然多来几次,它解决的是别把有限的抓取次数用在重复的地方。这件事做完,日志会更干净,效果评估才有意义;否则你看到的抓取量,可能有一大半是同一个页面被反复抓的计数。