爬取上千个页面不翻车: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_depth、max_pages等参数控制爬取规模,并掌握让上千页爬取"中断可续、随时可停"的实战技巧。
一、为什么深度爬取容易"翻车"?
单页爬取很简单,但一旦让爬虫"顺着链接自己爬",问题就来了:
- 页面指数爆炸:一个导航页可能引出几百个链接,深度每加一层,页面量翻几倍
- 内存与时间失控:结果全部堆在内存里,跑到一半机器先扛不住
- 中断即前功尽弃:云上实例被回收、网络抖动,几小时的爬取从零开始
Crawl4AI 的解决方案是把"探索顺序"抽象为可替换的策略(Strategy),并把"爬到哪了"变成可持久化的状态(State)——前者解决"爬什么",后者解决"断在哪"。所有策略源码位于 crawl4ai/deep_crawling/ 目录,官方完整教程见 docs/md_v2/core/deep-crawling.md。
二、Crawl4AI 深度爬取三大策略一览
三种策略都通过CrawlerRunConfig的deep_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_threshold | URL 分数下限(BFS/DFS) | 配合打分器过滤噪声页 |
另外,用FilterChain组合过滤规则(URL 模式、域名白名单、内容类型、SEO 评分、BM25 内容相关性等,见 filters.py),可以在发现链接时就把无关页面挡在门外——比爬完再丢弃更省资源。
四、崩溃恢复:断点续爬的正确姿势
这是大规模生产爬取的"保命"功能。三种策略都支持同一套状态持久化机制:
on_state_change:每爬完一个 URL 就触发一次回调,把当前状态存到文件/Redis/数据库resume_state:重启时把上次保存的状态传进去,爬虫自动跳过已爬 URL,从未爬队列继续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,非常适合"先侦察、再精采"的两阶段爬取。
六、新手避坑清单
- 永远给
max_pages上保险:max_depth决定"能走多深",max_pages决定"最多走多少",两者缺一不可 - 检查
result.success:个别页面 404 或被反爬拦截很正常,别让它中断整个任务 - HTTPS 站点加
preserve_https_for_internal_links=True:避免跟随重定向掉到不安全的 HTTP - 尊重 robots.txt:深度爬取默认不校验,生产环境建议自行配置
- BFF 配好打分器才好用:关键词、权重多调几轮,爬取质量立竿见影
- 长任务必开状态持久化:云环境实例随时可能被回收,断点续爬是刚需
写在最后
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),仅供参考