编程 crawl4ai:面向 LLM/RAG 的开源爬虫,不只是把 HTML 洗成 Markdown

2026-09-01 10:06:24

为什么不是 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_markdownfit_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
复制全文 生成海报 爬虫 LLM RAG Playwright crawl4ai Python

推荐文章

程序员茄子在线接单