项目简介

Crawl4AI 是目前 GitHub 上星标最多的开源网络爬虫项目(66.2k Stars),专为 AI 时代设计。它的核心理念是将网页内容转换为干净、结构化的 Markdown,为 RAG(检索增强生成)、AI Agent 和数据管道提供高质量的数据源。

“Crawl4AI turns the web into clean, LLM ready Markdown for RAG, agents, and data pipelines.”

项目数据:

为什么选择 Crawl4AI

市面上爬虫工具不少,但 Crawl4AI 有几个让人眼前一亮的差异化优势:

1. 真正开源免费

不像很多”开源”爬虫需要付费账户和 API Token,Crawl4AI 从核心到部署完全开源,Apache 2.0 许可证可自由商用。

2. LLM 原生设计

不是把爬虫结果丢给 LLM 就完事,而是从底层为 LLM 消费优化:智能 Markdown 输出、语义分块、BM25 过滤、结构化提取,全链路打通。

3. 实际速度快

异步浏览器池 + 三层缓存架构(permanent/hot/cold)+ Prefetch 模式,预取速度比完整处理快 5-10 倍。

4. 反检测能力强

内置 Undetected 浏览器模式、3 层反机器人检测、代理自动升级、Shadow DOM 扁平化,能绕过 Cloudflare、Akamai 等主流防护。

核心功能一览

智能内容转换

功能 说明
Clean Markdown 生成干净、结构化的 Markdown,格式准确还原
Fit Markdown 基于启发式过滤,去除噪声和无关内容
BM25 过滤 基于 BM25 算法提取核心信息,去除冗余
引用与参考文献 将页面链接转换为带编号的引用列表
表格智能提取 智能分块处理大型表格

结构化数据提取

方式 适用场景
CSS/XPath 选择器 无需 LLM,快速模式提取,适合结构化页面
LLM 提取 自然语言定义 Schema,适合非结构化内容
Schema 定义 自定义 JSON Schema 从重复模式中提取
语义分块 基于主题/正则/句子级别的智能分块

浏览器控制

from crawl4ai import BrowserConfig

config = BrowserConfig(
headless=True, # 无头模式
browser_type="chromium", # 支持 chromium / firefox / webkit
browser_type="undetected", # 反检测模式,绕过 Cloudflare
proxy_config=ProxyConfig(server="http://proxy:8080"), # 代理支持
user_data_dir="~/.crawl4ai/profile", # 持久化配置文件
use_persistent_context=True, # 复用浏览器状态
)

反爬与反检测(v0.8.5 新增)

  • 3 层反机器人检测:已知供应商 → 通用阻止指标 → 结构完整性检查
  • 代理自动升级:检测到封锁时自动切换代理链重试
  • Shadow DOM 扁平化:提取隐藏在 Shadow DOM 中的内容
  • 同意弹窗自动移除:自动关闭 Cookie/隐私弹窗

智能深度爬取

自适应爬虫架构:

URL 发现 → 3层链接评分 → 策略选择 → 内容提取
↑ ↓
Sitemap + Common Crawl 崩溃恢复 & 断点续爬
(秒级发现数千URL) (resume_state 回调)
  • 3 种深度爬取策略:BFS(广度优先)、DFS(深度优先)、Best-First(最佳优先)
  • 异步 URL 发现器:结合 sitemap 和 Common Crawl,秒级发现数千 URL
  • Prefetch 模式:仅获取 HTML 和链接,5-10 倍加速
  • 崩溃恢复:深度爬取中断后可从断点恢复

快速上手

安装

# pip 安装
pip install -U crawl4ai
crawl4ai-setup # 自动设置浏览器
crawl4ai-doctor # 验证安装是否正确

# 如遇浏览器问题,手动安装
python -m playwright install --with-deps chromium

Docker 部署(推荐生产使用)

docker pull unclecode/crawl4ai:latest
docker run -d -p 11235:11235 --name crawl4ai --shm-size=1g unclecode/crawl4ai:latest

# 监控仪表板: http://localhost:11235/dashboard
# 交互式游乐场: http://localhost:11235/playground

实战示例

1. 基础爬取 — 30 秒入门

import asyncio
from crawl4ai import AsyncWebCrawler

async def main():
async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://www.nbcnews.com/business")
print(result.markdown[:500]) # 打印前500字符

asyncio.run(main())

就这么简单,3 行核心代码完成爬取。

2. CSS 选择器提取 — 无需 LLM

适合结构清晰的页面,速度快、零成本:

import asyncio, json
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
from crawl4ai import JsonCssExtractionStrategy

# 定义提取 Schema
schema = {
"name": "Products",
"baseSelector": "div.product-item",
"fields": [
{"name": "title", "selector": "h3.name", "type": "text"},
{"name": "price", "selector": "span.price", "type": "text"},
{"name": "image", "selector": "img.thumb", "type": "attribute", "attribute": "src"}
]
}

run_config = CrawlerRunConfig(
extraction_strategy=JsonCssExtractionStrategy(schema)
)

async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://example.com/products", config=run_config)
products = json.loads(result.extracted_content)

3. LLM 智能提取 — 处理非结构化内容

import os, asyncio
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, LLMConfig
from crawl4ai import LLMExtractionStrategy
from pydantic import BaseModel, Field

class Product(BaseModel):
name: str = Field(..., description="产品名称")
price: str = Field(..., description="产品价格")
rating: str = Field(..., description="评分")

run_config = CrawlerRunConfig(
extraction_strategy=LLMExtractionStrategy(
llm_config=LLMConfig(provider="openai/gpt-4o", api_token=os.getenv('OPENAI_API_KEY')),
schema=Product.schema(),
extraction_type="schema",
instruction="提取页面上所有产品的名称、价格和评分"
),
)

async with AsyncWebCrawler() as crawler:
result = await crawler.arun(url="https://example.com/products", config=run_config)
print(result.extracted_content)

4. 执行 JS + 智能过滤

适合需要动态交互的页面:

import asyncio
from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig
from crawl4ai.content_filter_strategy import BM25ContentFilter
from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator

run_config = CrawlerRunConfig(
js_code=[
"""(async () => {
// 点击所有标签页加载动态内容
document.querySelectorAll('.tab').forEach(tab => {
tab.click();
});
})();"""
],
markdown_generator=DefaultMarkdownGenerator(
content_filter=BM25ContentFilter(
user_query="AI 技术趋势",
bm25_threshold=1.0
)
),
cache_mode=CacheMode.BYPASS,
)

async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler:
result = await crawler.arun(url="https://example.com", config=run_config)
print(result.markdown.fit_markdown) # 过滤后的精简内容

5. 命令行使用

# 基础爬取
crwl https://example.com -o markdown

# 深度爬取
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

# 带 LLM 提取
crwl https://example.com/products -q "Extract all product names and prices"

6. Docker API 调用

import requests

response = requests.post(
"http://localhost:11235/crawl",
json={"urls": ["https://example.com"], "priority": 10}
)
task_id = response.json()["task_id"]
result = requests.get(f"http://localhost:11235/task/{task_id}")
print(result.json())

Docker 部署详解

Docker 部署是生产环境的推荐方式,内置 FastAPI 服务器、浏览器池、监控面板:

核心端点

端点 方法 说明
/crawl POST 提交爬取任务
/task/{task_id} GET 查询任务结果
/monitor/health GET 系统健康状态
/monitor/browsers GET 浏览器池状态
/dashboard GET 监控仪表板(Web UI)
/playground GET 交互式游乐场

安全配置

# 启用 JWT 认证
docker run -d -p 11235:11235 \
-e CRAWL4AI_API_TOKEN=your-secret-token \
unclecode/crawl4ai:latest

# 禁用 Hooks(默认已禁用)
docker run -d -p 11235:11235 \
-e CRAWL4AI_HOOKS_ENABLED=false \
unclecode/crawl4ai:latest

与其他爬虫工具对比

特性 Crawl4AI Scrapy Selenium BeautifulSoup
语言 Python Python 多语言 Python
异步支持 ✅ 原生
JS 执行
Markdown 输出
LLM 集成 ✅ 内置
反检测 ✅ 内置 部分
Docker 部署
深度爬取
学习曲线
LLM 友好 ✅ 专为 LLM 设计

适用场景

1. RAG 数据采集

最核心的使用场景。将网页内容转为干净 Markdown,直接送入向量数据库:

# 爬取文档站,生成 Markdown 送入 RAG 管道
result = await crawler.arun(url="https://docs.example.com")
clean_markdown = result.markdown.fit_markdown
# → 直接存入向量数据库(Pinecone / Weaviate / ChromaDB)

2. AI Agent 工具

为 AI Agent 提供网页数据获取能力,类似 MCP 集成:

# Agent 通过 Crawl4AI 获取实时网页数据
result = await crawler.arun(url=user_provided_url)
context = result.markdown.raw_markdown
# → 喂给 LLM 进行分析和回答

3. 批量数据采集

利用深度爬取和并发能力,批量采集结构化数据:

results = await crawler.arun_many(
urls=["https://site.com/page/1", "https://site.com/page/2", ...],
config=run_config
)

4. 竞品监控与舆情分析

定时爬取目标网站,监控内容变化:

# 定时深度爬取
crwl https://competitor.com/blog --deep-crawl bfs --max-pages 50 -o markdown

安全注意事项

Crawl4AI 近期修复了几个重要安全问题,使用时需要注意:

  • v0.8.6 紧急升级:修复了 litellm 的 PyPI 供应链攻击,已替换为 unclecode-litellm
  • Docker RCE 修复(v0.8.5):/crawl 端点存在反序列化漏洞,已修复
  • Redis CVE 修复:已升级至 7.2.7 修复 CVE-2025-49844
  • Docker Hooks 默认禁用:生产环境保持禁用状态
  • 使用爬虫时请遵守目标网站的 robots.txt 和相关法律法规

总结

Crawl4AI 在 AI 时代的爬虫工具中确实有独特优势。它不是传统爬虫的简单改良,而是从设计之初就围绕 LLM 的需求来构建——干净的数据输出、智能的内容过滤、原生的结构化提取、内置的反检测能力。

推荐使用的场景:

  • RAG 系统的数据采集层
  • AI Agent 的网页数据获取工具
  • 需要处理动态内容的复杂爬取任务
  • 需要绕过反爬防护的实战场景

需要注意的地方:

  • 主要依赖 Playwright,资源占用相对较高
  • LLM 提取功能需要额外 API 费用
  • 深度爬取大规模站点时需注意合规性
  • 项目迭代较快,API 可能存在 Breaking Changes

对于需要在 AI 工作流中集成网页数据获取的开发者来说,Crawl4AI 是目前最成熟的开源方案之一。

GitHub 仓库:https://github.com/unclecode/crawl4ai