为什么不是 requests + BeautifulSoup?
大部分爬虫需求用 requests + BeautifulSoup 就能解决。但一旦你开始把抓下来的页面喂给 LLM 或 RAG,问题就变了:网页里 80% 的内容是导航、广告、脚本、弹窗,真正有用的正文只有几句。拿原始 HTML 直接灌给模型,既浪费 token,又拖慢响应。
Crawl4AI 解决的就是这一步:把网页“洗”成干净的 Markdown 或 JSON,而且自带异步浏览器池和反检测能力。它不是一个通用爬虫框架,而是一个面向 LLM/RAG 场景的预处理工具。
下面按实际使用顺序记录,包括安装、特性、代码示例和适用边界。
核心特性
- LLM 友好输出:自动生成结构化 Markdown,包含标题、表格、代码块、引用提示。内置 BM25 和启发式过滤算法去噪,输出可以直接给 RAG 或 Agent 消费。
- 多模态数据提取:支持 CSS 选择器、XPath 或任意 LLM(OpenAI、Ollama 等)提取结构化 JSON。内置智能分块机制和余弦相似度匹配,适合复杂页面精准采集。
- 企业级浏览器控制:基于 Playwright 构建异步浏览器池,支持持久化会话、代理认证、Shadow DOM 扁平化、虚拟滚动和 Undetected 隐身模式,用于对抗反爬。
- 生产就绪部署:官方 Docker 镜像 + FastAPI 服务,内置 JWT 认证、实时监控仪表盘、WebSocket 流式更新、GPU 加速支持。
注意:Crawl4AI Cloud API 目前处于封闭测试阶段,尚未正式开放。
适用场景
| 场景 | 说明 |
|---|---|
| RAG 知识库构建 | 批量抓取文档站,转成带引用的 Clean Markdown,配合 Fit Markdown 策略去掉导航和页脚,得到高质量向量语料 |
| 动态网页结构化提取 | 电商产品页、SaaS 定价页等 JS 渲染内容,执行渲染后用 LLM 或 CSS Schema 提取价格、课程信息等字段,输出 JSON |
| 大规模深度爬取 | 支持 BFS/DFS 策略全站爬取,有断点续传(Crash Recovery)和预取模式(Prefetch),URL 发现与处理效率提升 5-10 倍 |
| 反爬虫对抗采集 | 自定义浏览器 Profile、代理链自动升级、Stealth 隐身模式,可稳定抓取 Cloudflare 等严格防护站点 |
使用环境
- Python:3.10+
- Docker:AMD64 / ARM64
安装步骤
pip install -U crawl4ai
然后执行初始化:
crawl4ai-setup
检查环境:
crawl4ai-doctor
可选:安装 Playwright Chromium 依赖
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
使用示例
1. 基础异步爬取
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)
if __name__ == "__main__":
asyncio.run(main())
最简用法,返回对象同时包含 raw_markdown 和 fit_markdown。
2. CLI 命令行抓取
crwl https://www.nbcnews.com/business -o markdown
-o 支持 markdown / json 两种输出格式。
3. Docker API 提交任务
import requests
response = requests.post(
"http://localhost:11235/crawl",
json={"urls": ["https://example.com"], "priority": 10}
)
print(response.json())
适用于 Docker 部署场景,支持异步任务提交与结果查询。
判断与适用边界
- 如果只是抓静态页面,requests + BeautifulSoup 更轻量,没必要引入 Playwright 和异步池。
- 如果对“提取后的结构化字段”要求不高,只看正文文本,Crawl4AI 的默认过滤可能比自写正则更省事,但它的 fit_markdown 不保证 100% 准确,需要抽样验证。
- LLM 提取字段功能依赖外部 LLM API,意味着会引入额外成本和延迟;对延迟敏感的场景建议先用 CSS Schema 做确定性提取。
- 大规模爬取时,虽然支持断点续传,但目标站点的反爬策略变化很快,不要完全依赖隐身模式,自己做好请求频率控制和代理池还是有必要的。
- Docker 镜像默认监听
11235端口,暴露到公网时务必开启 JWT 认证,不要裸奔。
相关资源
- 项目仓库:github.com/unclecode/crawl4ai
- 官方网站:crawl4ai.com
- 技术文档:docs.crawl4ai.com
- 在线演示:colab.research.google.com/drive/1SgRPrByQLzjRfwoRNq1wSGE9nYY_EE8C