爬取上千个页面不翻车:Crawl4AI深度爬取BFS/DFS/BFF策略与崩溃恢复实战
2026/9/3 11:40:28 网站建设 项目流程

爬取上千个页面不翻车:Crawl4AI深度爬取BFS/DFS/BFF策略与崩溃恢复实战

【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai

Crawl4AI 是一款开源的 LLM 友好型网页爬虫与抓取框架,而它的深度爬取(Deep Crawling)能力正是大规模采集场景的核心:从单个起始 URL 出发,按 BFS、DFS 或 BFF(Best-First)三种策略自动探索整个网站,并内置断点续爬的崩溃恢复机制。本文带你从零理解这三种深度爬取策略的区别,学会用max_depthmax_pages等参数控制爬取规模,并掌握让上千页爬取"中断可续、随时可停"的实战技巧。

一、为什么深度爬取容易"翻车"?

单页爬取很简单,但一旦让爬虫"顺着链接自己爬",问题就来了:

  • 页面指数爆炸:一个导航页可能引出几百个链接,深度每加一层,页面量翻几倍
  • 内存与时间失控:结果全部堆在内存里,跑到一半机器先扛不住
  • 中断即前功尽弃:云上实例被回收、网络抖动,几小时的爬取从零开始

Crawl4AI 的解决方案是把"探索顺序"抽象为可替换的策略(Strategy),并把"爬到哪了"变成可持久化的状态(State)——前者解决"爬什么",后者解决"断在哪"。所有策略源码位于 crawl4ai/deep_crawling/ 目录,官方完整教程见 docs/md_v2/core/deep-crawling.md。

二、Crawl4AI 深度爬取三大策略一览

三种策略都通过CrawlerRunConfigdeep_crawl_strategy参数注入,定义分别位于 bfs_strategy.py、dfs_strategy.py、bff_strategy.py:

策略探索方式适合场景一句话记忆
BFS 广度优先一层爬完再爬下一层全站普查、站点测绘先扫一圈,再往深走
DFS 深度优先沿一条链路钻到底再回头分类树、文章系列一条路走到黑
BFF 最佳优先按打分器给 URL 打分,高分先爬聚焦特定主题内容好钢用在刀刃上

2.1 BFS 广度优先:稳妥的全站普查

BFS 策略逐层展开:先爬完第 0 层(起始页)的所有链接,再处理第 1 层……每一层内的 URL 会批量并发请求,速度快且结果均衡。

from crawl4ai import AsyncWebCrawler, CrawlerRunConfig from crawl4ai.deep_crawling import BFSDeepCrawlStrategy config = CrawlerRunConfig( deep_crawl_strategy=BFSDeepCrawlStrategy( max_depth=2, # 起始页 + 再往下 2 层 include_external=False, # 不跨出当前域名 max_pages=100, # 硬上限:最多 100 页 ), )

📌 新手建议:max_depth超过 3 时页面量会指数膨胀,务必同时设max_pages兜底。

2.2 DFS 深度优先:沿着一条路钻到底

DFS 用维护待爬队列:从起始页出发,顺着最新发现的链接一路深入,直到触及深度上限再回溯。它天然适合有层级结构的站点(比如"分类 → 子分类 → 文章"),且每个结果都会带上depth(深度)和parent_url(父页面)元数据,方便你还原爬取树。

2.3 BFF 最佳优先:按相关性排队爬取

BestFirstCrawlingStrategy(即 BFF,Best-First)是官方推荐的智能策略。它维护一个优先级队列,配合打分器(Scorer)给每个新发现的 URL 打分,分数高者优先爬取:

  • KeywordRelevanceScorer:URL 命中关键词越多,分越高
  • 还有FreshnessScorer(新鲜度)、PathDepthScorer(路径深度)、CompositeScorer(多因子组合)等,全部在 scorers.py 中
from crawl4ai.deep_crawling import BestFirstCrawlingStrategy from crawl4ai.deep_crawling.scorers import KeywordRelevanceScorer strategy = BestFirstCrawlingStrategy( max_depth=3, max_pages=25, url_scorer=KeywordRelevanceScorer( keywords=["教程", "部署", "指南"], weight=0.7, ), )

这样即使站点有上千页,爬虫也会把预算优先花在"教程/部署/指南"这类高价值页面上。BFF 按分数排序,无需再设score_threshold;而 BFS/DFS 可以设置该阈值,直接跳过低分 URL。

三、控制规模:四个关键参数速查

参数作用建议值
max_depth最大探索层数(起始页为 0 层)≤ 3,配合 max_pages 使用
max_pages总页面硬上限按预算设定,防止失控
include_external是否跟随跨域链接默认 False,保持同域
score_thresholdURL 分数下限(BFS/DFS)配合打分器过滤噪声页

另外,用FilterChain组合过滤规则(URL 模式、域名白名单、内容类型、SEO 评分、BM25 内容相关性等,见 filters.py),可以在发现链接时就把无关页面挡在门外——比爬完再丢弃更省资源。

四、崩溃恢复:断点续爬的正确姿势

这是大规模生产爬取的"保命"功能。三种策略都支持同一套状态持久化机制:

  1. on_state_change:每爬完一个 URL 就触发一次回调,把当前状态存到文件/Redis/数据库
  2. resume_state:重启时把上次保存的状态传进去,爬虫自动跳过已爬 URL,从未爬队列继续
  3. export_state():手动导出最后一次捕获的状态

状态结构是纯 JSON,包含visited(已爬 URL)、pending/stack/queue_items(待爬队列,随策略而异)、depths(深度映射)、pages_crawled(计数)等字段。

async def save_state(state: dict): with open("crawl_state.json", "w") as f: json.dump(state, f) # 生产环境建议写 Redis/数据库 strategy = BFSDeepCrawlStrategy( max_depth=3, max_pages=1000, on_state_change=save_state, # 每页保存一次进度 resume_state=load_saved_state(), # 有存档则自动续爬 )

🎁 零开销设计:不开启这两个参数时没有任何性能损耗;开启了之后,即使实例中途被杀,重启后已爬页面一个都不会重复。完整可运行的演示(含"模拟崩溃→续爬→验证零重复")见 docs/examples/deep_crawl_crash_recovery.py。

五、流式输出与中途叫停

  • 流式模式(stream=True:结果随爬随出,用async for逐条处理,内存压力小,还适合边爬边入库;批量模式则等全部完成后返回列表。
  • 随时取消:调用strategy.cancel()(线程安全)或用should_cancel回调每爬一页检查一次外部信号(比如 Redis 里的任务状态),爬虫会在当前页完成后优雅停止。
  • 快速发现模式:若只想先摸清楚站点的 URL 地图,开启prefetch=True可跳过 Markdown 生成、内容抓取等重活,单页耗时降到原来的 1/5~1/10,非常适合"先侦察、再精采"的两阶段爬取。

六、新手避坑清单

  1. 永远给max_pages上保险max_depth决定"能走多深",max_pages决定"最多走多少",两者缺一不可
  2. 检查result.success:个别页面 404 或被反爬拦截很正常,别让它中断整个任务
  3. HTTPS 站点加preserve_https_for_internal_links=True:避免跟随重定向掉到不安全的 HTTP
  4. 尊重 robots.txt:深度爬取默认不校验,生产环境建议自行配置
  5. BFF 配好打分器才好用:关键词、权重多调几轮,爬取质量立竿见影
  6. 长任务必开状态持久化:云环境实例随时可能被回收,断点续爬是刚需

写在最后

Crawl4AI 的深度爬取把"探索策略""规模控制""状态持久化""随时取消"四件事都收敛到了 crawl4ai/deep_crawling/ 这一套策略接口里:BFS 稳妥普查、DFS 垂直深挖、BFF 智能聚焦,再配上崩溃恢复与流式输出,上千页的采集任务从此可控、可续、可停。动手前建议先跑一遍官方示例 docs/examples/deepcrawl_example.py,感受三种策略在同一站点上的实际差异——理解比背参数更重要。

【免费下载链接】crawl4ai🚀🤖 Crawl4AI: Open-source LLM Friendly Web Crawler & Scraper. Don't be shy, join here: https://discord.gg/jP8KfhDhyN项目地址: https://gitcode.com/GitHub_Trending/craw/crawl4ai

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询