在蜘蛛池里,同一个入口页常常能以好几种地址打开。带来源参数的、带排序参数的、结尾多一个斜杠的、大小写不同的,返回的内容几乎一样。对访客来说无所谓,对搜索蜘蛛来说却是好几个地址,而它们指向的是同一份内容。
同一页为什么会裂成多个地址
大多数情况下不是有人刻意做的,而是程序默认行为叠加出来的结果。链接在传递过程中被自动加参数,模板里对地址的处理不统一,历史改版留下的旧路径仍然可达,都会让一个页面出现多条 URL。
跟踪参数与来源标记
utm_source、from、ref、spm 这类参数只记录来源,不影响页面输出。但它们改变了 URL 字符串,蜘蛛按字符串区分地址,于是同一页被当成多个页面分别抓取。
排序、筛选与分页
列表页的排序方式、筛选条件、分页页码都属于这一类。如果每个组合都生成一条可访问地址,入口页很容易膨胀出成百上千条近似 URL,而这些页面之间的内容差异可能只有几行。
形态上的细节差异
- 大小写不同:/Page 与 /page 在部分服务器上都能打开
- 结尾斜杠:/a 与 /a/ 被当作两条地址
- 默认文件:/a 与 /a/index.html 同时可达
- 协议与主机名:http 与 https、带 www 与不带 www 并存
- 参数顺序:?a=1&b=2 与 ?b=2&a=1 是两个不同的字符串
- URL 编码差异:中文路径被编码成不同形式
对蜘蛛池运营的实际影响
- 抓取预算被分摊:同一份内容占用多条地址的抓取额度,真正需要被发现的页面分到的次数变少。
- 发现信号被稀释:外链、主动提交、内链指向不同形态,抓取提示难以集中到一条地址上。
- 统计口径失真:日志里的抓取量看起来很高,去重之后可能只剩一半,容易误判入口页的实际表现。
- 淘汰判断失准:替换旧资源时若按未归一的 URL 统计,可能把同一页的不同形态当成两个资源分别处理。
处理思路
从生成端统一
入口页输出的链接、sitemap 里的地址、提交时使用的地址,尽量保持同一种形态:统一小写、统一结尾斜杠策略、不带多余参数。内部链接不要随手拼接来源标记。
用 canonical 与 robots 兜底
对确实需要保留的带参地址,可以在页面里用 canonical 指向规范地址,减少蜘蛛在多个形态之间做选择。对完全无内容价值的参数组合,可以用 robots.txt 屏蔽抓取,但要注意屏蔽之后蜘蛛也无法通过该地址发现规范页。
- 先跑一遍日志,把访问过的 URL 做归一化,看去重前后差多少
- 列出差异最大的参数类型,判断哪些是必要的、哪些是噪音
- 在生成端收敛地址形态,再补上 canonical
- 观察一到两周,看规范地址在抓取中的占比是否上升
canonical 是提示而不是命令,蜘蛛有自己的判断逻辑,处理之后仍需以实际抓取与收录情况为准。
复核方式
归一化后的抓取统计、被收录地址的形态抽查、新入口页上线时提交的地址是否唯一,这三项结合起来看,比单看总抓取量更能说明问题。地址越干净,后面判断资源好坏时越不容易被干扰。