做蜘蛛池时,入口页的数量、域名和 IP 往往被反复讨论,但从入口页到目标页之间的链接层级,却经常被忽略。爬虫是顺着链接走的,每多一层跳转,就多一次解析、排队和优先级判断。层级越深,目标页被发现、被安排抓取的机会就越不确定。
爬虫是怎么从入口页走到目标页的
调度器拿到入口页 URL 之后,会抓取页面、解析 HTML、抽取其中的链接,把新发现的 URL 放进待抓取队列。这个过程可以重复,但不会无条件地一直往下走。待抓队列里的每个 URL 都有优先级,而链接深度是影响优先级的因素之一。
换句话说,入口页本身被爬虫抓到,只是第一步。目标页能不能进入队列、以什么顺序进入队列,取决于它离入口页有多远、中间经过了什么页面。
一跳、两跳、三跳,差别在哪
如果目标链接直接写在入口页上,就是一跳。爬虫抓到入口页,解析后立刻就能看到目标 URL,这是最短路径。
如果在入口页和目标页之间加了一层中间页,比如一个列表页、聚合页或者分类页,就变成两跳。爬虫要先抓中间页,再从中间页里找到目标链接。多出来的这一跳,会消耗一次抓取配额,也会让目标页的发现时间往后排。
三跳及以上的情况,问题会更明显:
- 发现链路变长,目标页进入待抓队列的时间被拉长。
- 中间页如果抓取失败、返回异常状态码或者内容为空,链路就断了。
- 中间页一旦被判定为低质量,爬虫可能不再继续往下跟。
- 同一批目标页分散在不同深度的链路上,抓取节奏会更难预测。
所以讨论深度,本质是在讨论“有多少环节可能出问题”。环节越多,不确定性越大。
深度和抓取预算要放在一起看
爬虫在单个站点或单批资源上有大致的抓取额度。入口页、中间页、目标页都在消耗这份额度。如果中间层太多,预算会大量花在“过路页”上,真正想让它抓的目标页反而分不到多少。
这也是为什么有些池子看起来抓取量不低,但落到目标页的抓取记录很少——抓取被中间层吃掉了。入口页、中间页、中间页、目标页这种结构,爬虫每往下一层都要花一次成本,而收益是滞后的。
把链接深度压下来的几种做法
- 目标链接直接放入口页:在入口页正文或列表里直接出现目标 URL,减少中间跳转。
- 控制中间页数量:能一层解决的就不要做两层,尤其是纯导航性质的页面。
- 让中间页有真实内容:如果确实需要中间层,页面不能是空壳,至少要能被解析出有效链接。
- 避免链接藏在脚本里:靠 JS 渲染出来的链接,不一定能被顺利抽取,等于人为增加了深度。
- 减少重复链接:同一个目标 URL 在多个位置反复出现,不会让发现更快,反而容易稀释页面里的有效链接密度。
几个常见的理解偏差
有人觉得层级越深,链接传递的作用越强,这没有依据。深度不产生额外价值,它只增加被发现的成本。也有人认为只要入口页数量足够多,深度问题可以忽略,但如果每一层都要消耗抓取额度,入口页再多也只能摊薄到更长的发现链路上。
深度不是越多越好,也不是越浅越万能。关键是在可维护的前提下,让目标页离入口页尽可能近,同时中间的每一跳都有存在的理由。
日常可以检查的几个点
- 入口页源码里,目标链接是否直接可见,还是需要经过跳转或脚本渲染。
- 中间页的抓取状态码是否正常,有没有大量 4xx、5xx 挡住链路。
- 同一批目标页的链接深度是否统一,避免深浅混杂导致抓取节奏不可控。
- 抓取日志里,真正落到目标页的请求占整体请求的比例大概是多少。
把这几项定期看一眼,比单纯追求入口页数量更容易发现问题。链接深度不显眼,但它决定了入口页的抓取能不能顺利传导到目标页。