Crawl4AI 学习指南(适用于 v0.7.x,更新于 2025-12-18)
Crawl4AI 是一个开源的浏览器爬虫框架,专为LLM优化,可将网页转换为干净的Markdown/HTML。它基于Playwright,支持CSS/XPath/LLM等多种提取策略,适用于RAG、数据收集等场景。安装需Python≥3.9,并配置Playwright浏览器。核心组件包括异步爬虫入口、浏览器配置和运行参数管理,提供丰富的Hook机制。文档包含快速入门、配置选项、批量爬取示例及性能优
·
Crawl4AI 学习指南(适用于 v0.7.x,更新于 2025-12-18)
https://docs.crawl4ai.com/core/quickstart/
本文面向希望快速上手并理解 Crawl4AI 工作原理的开发者,涵盖安装、核心概念、常用配置、运行流程、调试与性能优化。示例以异步接口(
AsyncWebCrawler)为主。
1. 它是什么
- 开源、LLM 友好的浏览器爬虫框架,自动把网页转成干净 Markdown/HTML,支持 CSS/XPath/LLM 等提取策略。
- 以 Playwright 启动浏览器,提供丰富的运行配置与 Hook,适合 RAG、数据收集、产品监测等场景。
2. 安装与环境准备
- Python & 虚拟环境:推荐 Python ≥3.9,使用
venv或conda。 - 安装库:
pip install -U crawl4ai # 核心功能 # 或安装全量特性(含 LLM/向量/模型依赖) pip install "crawl4ai[all]" - 浏览器下载(必做,否则会报 Executable not found):
python -m playwright install chromium - 一次性初始化/自检(可选):
crawl4ai-setup # 下载模型、校验依赖 crawl4ai-doctor # 输出环境检查结果
3. 核心组件与职责
AsyncWebCrawler:对外入口,负责生命周期管理(启动/关闭浏览器)、调度单次或批量抓取。BrowserConfig:浏览器级别设置(引擎、headless、用户代理、代理、超时、视口等)。CrawlerRunConfig:单次抓取的运行参数(缓存、会话、等待条件、过滤、提取策略、Markdown 生成等)。CrawlerStrategy(默认 Playwright 策略):控制页面创建、导航、Hook 调用、出错重试。BrowserManager:封装 Playwright 的浏览器/上下文/页面资源池,处理启动、复用与关闭。CrawlResult:返回的结果对象,常用字段:success、status_code、error_message、html、cleaned_html、markdown、links、images、metadata。- Hook 体系:
before_goto / after_goto / before_extract / after_extract等,可插入自定义逻辑。
4. 最小可运行示例
import asyncio
from crawl4ai import AsyncWebCrawler
async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://example.com")
print(result.markdown[:300])
asyncio.run(main())
5. 常用配置速查
创建配置对象:
from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig,枚举如CacheMode也在同一命名空间。
5.1 BrowserConfig(浏览器级)
browser_type:"chromium"(默认)/"firefox"/"webkit"headless:True/False,调试时可设 False。user_agent: 伪装 UA。proxy: 形如http://user:pass@host:port。viewport: 视口大小,提升渲染一致性。timeout: 启动/新页超时毫秒数。
5.2 CrawlerRunConfig(单次抓取级)
- 缓存/会话:
cache_mode:CacheMode.ENABLED(读写缓存)、BYPASS(跳过读取但写入)、DISABLED(完全不用缓存)。session_id: 复用浏览器会话,适合需要登录或保持 Cookie 的场景。
- 导航控制:
timeout: 单页导航超时(毫秒)。wait_for: CSS 选择器或可执行条件,等待元素出现再提取。js_code/c4a_script: 进入页面后执行 JS(如点击“加载更多”)。
- 内容过滤:
excluded_tags: 例如["nav", "footer"]去除导航/页脚噪音。exclude_external_links、exclude_social_media_domains: 剔除外链或社媒域名。word_count_threshold: 忽略过短文本块。
- 提取/转换:
extraction_strategy: CSS/XPath/LLM/JSON schema 等结构化提取策略。chunking_strategy:RegexChunking等切块方式,为 LLM/向量化做准备。markdown_generator: 自定义 HTML→Markdown 规则。
- 合规与日志:
check_robots_txt: 遵守 robots.txt,默认建议开启。verbose: 显示详细日志,排障友好。
6. 批量与并发示例
from crawl4ai import AsyncWebCrawler
from crawl4ai.async_configs import CrawlerRunConfig
urls = ["https://example.com", "https://www.python.org"]
async def main():
run_cfg = CrawlerRunConfig(cache_mode="BYPASS", verbose=True)
async with AsyncWebCrawler() as crawler:
results = await crawler.arun_many(urls, config=run_cfg, max_concurrency=5)
for url, res in zip(urls, results):
print(url, res.success, len(res.markdown))
asyncio.run(main())
arun_many内部基于 asyncio 并发;请自行控制max_concurrency以避免目标站点限流。
7. 动态站点与交互
- 使用
wait_for="div.article"等待渲染完成。 - 在
js_code中编写脚本模拟点击滚动:js = "document.querySelector('button.load-more')?.click();" run_cfg = CrawlerRunConfig(js_code=[js], wait_for=".item") - 若站点需要登录:
- 先手动登录并导出 Cookie,再在
BrowserConfig(cookies=...)或自定义 Hook 中注入。 - 结合
session_id复用上下文,减少重复登录。
- 先手动登录并导出 Cookie,再在
8. CLI 与 Docker(可选)
- CLI:
crwl https://example.com -o markdown crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10 - Docker 体验版(0.7 系列):
docker pull unclecode/crawl4ai:0.7.0 docker run -d -p 11235:11235 --shm-size=1g unclecode/crawl4ai:0.7.0 # Playground: http://localhost:11235/playground
9. 运行流程原理(简化视图)
- 创建
AsyncWebCrawler→ 根据BrowserConfig启动 Playwright 浏览器。 - 为每个 URL 创建页面 → 执行 Hook
before_goto。 page.goto(url, wait_until="domcontentloaded")或按wait_for条件等待。- 执行
js_code/c4a_script→ 再次等待条件。 - 提取:
- 抽取原始 HTML → 清洗(移除噪音标签、外链等)。
- Markdown 生成 + 可选结构化提取(CSS/XPath/LLM)。
- 组装
CrawlResult返回;触发after_extract等 Hook。 - 关闭页面/浏览器(或由上下文管理器自动处理)。
10. 性能与稳定性建议
- 显式设置
cache_mode与session_id,避免不确定的缓存行为。 - 控制并发:对公共站点保持礼貌(并发 3–5),必要时加延时或限速。
- 过滤噪音:
excluded_tags/word_count_threshold减少无用文本,降低后续 LLM 成本。 - 统一环境:在容器/CI 中固定字体、locale、Playwright 版本,避免渲染差异。
- 调试时设
verbose=True,并可将headless=False观察页面。
11. 常见错误排查
- Executable doesn’t exist:未运行
python -m playwright install chromium。 - ERR_CONNECTION_RESET / 超时:网络被拦截或目标站不可达;先用
curl验证,再配置代理proxy。 - robots.txt 拒绝 (403):关闭
check_robots_txt仅用于测试,生产应遵守站点策略。 - 内容为空或截断:确认
wait_for/timeout是否足够,或页面需滚动加载时加入js_code。
12. 进一步学习
- 官方文档(v0.7.x):
https://docs.crawl4ai.com/ - 示例与源码:
https://github.com/bogpad/crawl4ai - 博客进阶文章:缓存/并发/提取策略性能调优(crawl4.com 博客系列)。
13. 与 LLM 交互(DeepSeek / ChatGPT 等)
Crawl4AI 基于 LiteLLM,支持任何被 LiteLLM 适配的提供商;通过
LLMConfig(provider=..., api_token=..., base_url=...)即可切换模型。
13.1 安装与依赖
- 未安装 LLM 依赖时执行:
pip install "crawl4ai[all]"(包含 LiteLLM 与常用模型适配)。 - 最小化依赖方案:确保有
pip install litellm,否则LLMConfig无法调用外部模型。
13.2 凭证与环境变量
- OpenAI / ChatGPT:
export OPENAI_API_KEY=sk-... - DeepSeek:
export DEEPSEEK_API_KEY=sk-...,DeepSeek 兼容 OpenAI 协议,基址默认https://api.deepseek.com/v1。 - 其他厂商遵循 LiteLLM 约定设置对应
*_API_KEY,如ANTHROPIC_API_KEY、GROQ_API_KEY、GEMINI_API_KEY、OLLAMA_API_BASE+model等。
13.3 快速示例:用 LLMExtractionStrategy 结构化提取
import os
from crawl4ai import AsyncWebCrawler, LLMConfig
from crawl4ai.extraction_strategy import LLMExtractionStrategy
llm_cfg = LLMConfig(
provider="openai/gpt-4o-mini", # ChatGPT 家族;改成 "deepseek/deepseek-chat" 即用 DeepSeek
api_token=os.getenv("OPENAI_API_KEY"),
)
strategy = LLMExtractionStrategy(
llm_config=llm_cfg,
instruction="提取页面主标题(title)和摘要(summary)",
schema={
"type": "object",
"properties": {
"title": {"type": "string"},
"summary": {"type": "string"}
},
"required": ["title", "summary"],
},
)
async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(
url="https://example.com",
extraction_strategy=strategy,
)
print(result.extracted_content) # LLM 生成的结构化结果
13.4 切换到 DeepSeek
- 仅替换配置即可:
from crawl4ai import LLMConfig
deepseek_cfg = LLMConfig(
provider="deepseek/deepseek-chat", # 思维链版可用 deepseek/deepseek-reasoner
api_token=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1", # OpenAI 兼容端点
)
13.5 常见坑位与优化
- 速率/费用:LLM 调用有延迟与成本,批量任务可在
LLMConfig里调低并发或启用重试退避,或把长文先chunk后再投喂 LLM。 - 优先 schema:能用 CSS/XPath/正则解决的场景优先使用非 LLM 提取,LLM 仅补充复杂语义,能显著省费。
- 上下文压缩:对长页面可先用
chunking_strategy+ 向量召回,减少进入 LLM 的 token。
14. AsyncPlaywrightCrawlerStrategy 是什么
- 定位:Crawl4AI 默认的浏览器抓取策略,实现
AsyncCrawlerStrategy接口;负责创建/复用 Playwright 浏览器、上下文与页面,并把抓取结果交给后续清洗和提取管线。 - 主要职责:
- 依据
BrowserConfig启动(或复用)浏览器,设置代理、UA、视口、下载目录、Cookie、持久化会话等。 - 按
CrawlerRunConfig导航页面:执行page.goto,等待wait_until/wait_for条件;可执行js_code、虚拟滚动、Hook(before/after_goto、before/after_extract)。 - 收集 HTML/截图/下载文件/网络资源,封装
CrawlResult(html、cleaned_html、markdown、links、images、metadata、extracted_content等)。
- 依据
- 适用场景:需要 JS 渲染、反爬交互、滚动加载、文件下载等动态站点。若目标是纯静态页面,可换用更轻的 HTTP 策略(如
AsyncHTTPCrawlerStrategy,0.5+ 提供)。 - 常用配置提示:
BrowserConfig:proxy/user_agent/accept_downloads/downloads_path/cookies/headless/timeout。CrawlerRunConfig:wait_until/wait_for/js_code/virtual_scroll_config/check_robots_txt/cache_mode/session_id。
- 自定义挂载示例:
from crawl4ai import AsyncWebCrawler, BrowserConfig from crawl4ai.async_crawler_strategy import AsyncPlaywrightCrawlerStrategy bcfg = BrowserConfig(headless=True) strategy = AsyncPlaywrightCrawlerStrategy(browser_config=bcfg) async with AsyncWebCrawler( config=bcfg, crawler_strategy=strategy, ) as crawler: res = await crawler.arun(url="https://example.com") print(res.success, len(res.markdown))
完成本篇后,你可以:
- 在本地运行简单或批量抓取;
- 通过配置 Cache/Session/Hook/JS 满足动态站点需求;
- 理解内部流程,定位常见问题并做性能优化。
更多推荐


所有评论(0)