蜘蛛沿站内链接前进,路径一旦打结,就会出现反复抓同一个地址、URL 越爬越长、抓取量上去了但有效页面没增加的情况。这类问题不会报错,只有翻访问日志、自己用爬虫走一遍,才会看到痕迹。下面按识别、拆解、预防三步来说。
路径打结的常见形态
- 参数循环:筛选、排序、会话标识、跟踪参数自由组合,生成一批只有参数不同的地址,页面之间又互相带链接,蜘蛛可以一直往深处走。
- 分页与筛选互相指向:筛选结果页里放分页链接,分页页里又放筛选链接,两个维度相乘,路径数量成倍增长。
- 标签、归档、日历连环:标签页指向文章,文章底部又指向全部标签;日期归档页互相指向前后月份,越往前内容越少。
- 列表与详情互相回流:详情页的“相关推荐”“返回列表”指回聚合页,聚合页再指向详情,形成闭合回路。
怎么判断是循环,而不是正常抓取
正常抓取也会重复访问同一个页面,区别在于路径是否收敛。循环的特征是:同一批内容被不同的地址反复覆盖,抓取次数增加,独立 URL 数量却增长缓慢。
访问日志里的信号
- 同一路径前缀下出现大量参数组合,URL 越来越长。
- 蜘蛛在某一目录下停留时间很长,但抓到的有效 URL 很少。
- 抓取时间集中在少数几个模板页,详情页反而很少被碰。
- 响应时间随着抓取量上升逐渐变慢,说明循环也在消耗服务器。
自己爬一遍
用爬虫工具从首页出发,设置深度上限(比如 5 层)和每层 URL 上限,看抓取结果的深度分布。如果深层出现大量参数相同、内容相似的地址,基本可以确定路径没收敛。也可以只抓取某个目录,观察它是否会绕回自己。
拆解思路:给每条路径留一个出口
- 参数收敛:能合并的参数合并,能去掉的跟踪参数去掉;确实要保留的筛选组合,用 canonical 指向主版本,并且不要在页面里生成可被跟进的链接。
- 把分页和筛选分开:分页只沿一个维度推进,筛选结果页不输出分页链接,需要浏览更多时用“加载更多”由前端处理,不生成新地址。
- 限制标签与归档:只保留有内容、有检索价值的标签;归档页合并到少数几个入口,不要做成年月日互相链接的网。
- 控制相关推荐:详情页底部的推荐可以指向同类内容,但不要把所有模块都连回列表页;列表页与详情页之间保留一条清晰的上下级关系即可。
- 给无限内容设边界:日历、论坛分页、搜索结果这类会无限延伸的页面,明确一个停止点,或者用 robots.txt 屏蔽无价值的深层参数路径。
循环与服务器负载是连在一起的
循环抓取会放大请求量,占用带宽和数据库查询。发现抓取速率异常上升时,可以先看日志里的响应时间和状态码分布,再决定是否用 429 配合 Retry-After 给蜘蛛限速。限速是缓解手段,真正要处理的还是路径本身:路径不收口,限速只是让循环走得慢一点。
上线后的检查清单
- 从首页出发模拟抓取,设置深度上限,检查是否有目录在自我循环。
- 抽查筛选、排序、分页组合,确认不会生成新的可抓链接。
- 检查标签页、归档页之间的互链,避免形成闭环。
- 观察日志中同一模板页的抓取占比,超过预期就回头查内链。
- 服务器变慢时先确认是不是循环带来的额外压力,再调整抓取节奏。
路径循环的代价不是流量,而是抓取时间被稀释:蜘蛛把有限的时间花在了重复的地址上,真正需要更新的页面就排到了后面。