如果一个站点的 URL 是有限的,蜘蛛迟早会爬完;但如果 URL 能无限生成,蜘蛛就会一直爬下去。抓取陷阱指的就是后者——站点在无意中提供了一条可以自我繁殖的抓取路径,蜘蛛顺着走下去,越走越远,却始终碰不到真正的尽头。
常见的几种无限展开
- 日历分页:日期归档里给每一天都生成「下一天」的链接,可以一直点到很久以前或未来。
- 参数组合:筛选、排序、视图切换、每页条数叠加在一起,同一批商品能拼出成百上千个 URL。
- 会话与追踪参数:地址上挂着 sessionid、from、ref 之类的值,同一个页面每次访问看起来都像新地址。
- 站内搜索结果页:搜索框可被任意关键词触发,蜘蛛顺着链接就能穷举出无数个结果页。
- 多版本页面:打印版、移动版、分享短链各自成 URL,内容却几乎一样。
为什么蜘蛛会一直爬下去
蜘蛛没有「这个站我爬够了」的判断,它靠的是链接和信号。只要一个 URL 返回 200,并且页面上还有其他没见过的链接,它就会被放进待抓队列。URL 生成的成本越低,队列就越长,而站点的抓取容量是有限的——被这些低价值地址占掉的份额,正是深层内容拿不到的那部分。
另一个容易被忽略的点是重复内容。同一套内容分散在几十个 URL 上,搜索引擎需要在它们之间做选择,权重被摊薄,页面之间也很难形成清晰的主版本。
从日志里认出来
看几组数字就够了:蜘蛛访问的 URL 里,带参数的比例有多高;同一路径下不同参数组合被访问的次数,是否远高于正文页;单个会话里蜘蛛连续访问的地址,是否呈现明显的排列组合特征。如果某类 URL 的抓取量占比很高、但带来流量的比例很低,基本可以确认是陷阱。
处理思路
- 先判断价值:有搜索需求、有转化价值的参数组合留着,纯排列组合的砍掉。
- 用参数规范收口:站内链接统一只保留必要的参数,视图、排序类参数尽量用前端方式处理,不写进 href。
- 加上抓取约束:对无价值路径用 robots.txt 的 Disallow 拦住,但要清楚它只是不让抓,并不等于 URL 不会被索引,必要时配合 noindex,而 noindex 需要页面能被抓取才生效,两者的作用范围要分开处理。
- 管住会话与追踪参数:内部链接里不要带 sessionid、utm 等值,让蜘蛛看到的地址是干净的。
- 明确主版本:多版本内容用 canonical 指向主页面,让重复的地址有统一出口。
- 给蜘蛛留出目录:用 Sitemap 主动提交真正需要被发现的 URL,让蜘蛛不必自己去穷举。
改完之后怎么验证
调整后不要指望隔天见效,抓取结构的重建需要一段时间。可以持续观察蜘蛛对各目录的访问占比是否变化,正文页的抓取频次有没有回升。也可以用站内日志对比调整前后同一批 URL 的访问次数,看排列组合类的地址是否明显减少。
抓取陷阱很少是有人故意造的,多数是分页、筛选、追踪参数在日常迭代里一点点堆出来的。定期翻一次日志,比事后花几个月清理要省力得多。