# Crawl4ai专为LLM而生的爬虫

做 AI 应用的人，迟早都会撞上同一个问题--喂给模型的数据从哪来？
模型自己不会上网。你要给它知识，就得先去网上抓内容、清洗、转成它能吃的格式。而网页抓取这件事，从来都不简单：动态加载、反爬、登录态、表格、分页、JS 渲染……每个都是坑。
有人专门为 LLM 场景做了一个爬虫，把抓取到的网页直接转成干净的 Markdown。这个项目叫 `crawl4ai`，是 GitHub 上 star 最多的爬虫，作者是 unclecode。

GitHub地址：https://github.com/unclecode/crawl4ai

## 它到底是什么？
**crawl4ai 是一个开源的、对 LLM 友好的网页爬虫和抓取工具，专门把网页转成干净的 Markdown，喂给 RAG、agent 和数据管道。**
它的官方定位写得很直白：

> 把网页变成干净、LLM 可用的 Markdown，服务 RAG、agent 和数据管道。快速、可控、被 5 万+ star 社区实战检验。

技术栈是 Python，Apache-2.0 协议，作者把它定位成“为可用性而开源”--任何人都能用，不设门槛。

为什么作者要做这个？

README 里有个挺有意思的小故事：2023 年他需要把网页转成 Markdown，找了个号称“开源”的方案，结果要注册账号、要 API token、还要 16 美元，最后还不好用。他“暴怒模式”启动，几天内做出了 crawl4ai，结果一炮走红。
所以他做这件事的初心很明确：**抓网页这件事，不该被收费墙和 token 卡住。**

## 为什么“LLM 友好”这么重要？

很多人以为爬虫就是“把 HTML 抓下来”，其实最难的是抓完之后。普通的 HTML 直接喂给模型，会有几个问题：
-  导航栏、广告、页脚全是噪音，浪费 token 还干扰理解
- 表格、代码块、标题层级乱掉，模型读不出结构
- 接丢失，没法做引用溯源
- 动态加载的内容抓不全

crawl4ai 针对这些逐个解决：
### 1）干净的 Markdown
抓下来不是原始 HTML，而是结构清晰的 Markdown--标题、表格、代码块都对齐，格式准确。
### 2）Fit Markdown（智能过滤）
用启发式规则（还有 BM25 算法）去掉噪音，只留正文核心内容。直接喂模型，省 token 又准。
### 3）引用与参考
把页面链接转成带编号的参考列表，输出里带干净的引用。做 RAG 时溯源特别有用。
### 4）自定义策略
你可以写自己的 Markdown 生成策略，针对特定网站做优化。

这一套下来，输出就是“模型能直接吃”的格式，不用你再写一堆清洗代码。

## 默认能做什么？
功能面非常广，按几大块说：
### 结构化数据抽取
-  **LLM 驱动抽取**：支持所有 LLM（开源的、闭源的），从页面里抽结构化数据
-  **分块策略**：按主题、正则、句子级分块，做针对性处理
- **余弦相似度**：按查询语义找相关内容块
- **CSS/XPath 抽取**：用选择器做快速 schema 抽取，定义自己的 schema 把重复结构转成 JSON

### 浏览器集成
- **托管浏览器**：用你自己的浏览器，完全控制，绕过反爬
- **远程浏览器控制**：接 Chrome DevTools Protocol，做大规模远程抓取
- **浏览器 Profiler**：保存登录态、cookie、配置，复用 profile
- **Session 管理**：保留浏览器状态，多步爬取复用
- **代理支持**：带认证的代理无缝接入
- **多浏览器**：Chromium、Firefox、WebKit 都支持
- **动态视口**：自动调整视口匹配页面内容，确保全部渲染

### 抓取与抓取
- **媒体支持**：图片、音频、视频、srcset、picture 都能抽
- **动态抓取**：执行 JS、等待异步内容
- **截图**：抓取时截屏，调试或分析用
- **原始数据**：直接处理 raw HTML 或本地文件
- **链接抽取**：内链、外链、iframe 内容都能拿
- **自定义 Hook**：每一步都能挂钩子改行为
- **缓存**：避免重复抓取，提速
- **懒加载处理**：等图片加载完，不漏内容
- **整页扫描**：模拟滚动，搞定无限滚动页面

### 深度爬取
支持 BFS 等策略做整站深度爬取，还能设最大页数。而且有个很实用的能力--**崩溃恢复**：长时间爬取崩了能从 `resume_state` 接着跑，不用从头再来。还有 `prefetch` 模式，URL 发现快 5-10 倍。

### 部署
- **Docker 化**：带 FastAPI server，部署方便
- **安全认证**：内置 JWT token 认证
- **可扩展架构**：为大规模生产设计
- **云部署**：主流云平台都有现成配置

## 安装
```
pip install -U crawl4ai
crawl4ai-setup      # 装浏览器
crawl4ai-doctor     # 验证安装
```

装完跑一个最简单的爬取：
```
import asyncio
from crawl4ai import *

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())
```

几行代码，拿到干净 Markdown。

## 命令行（v0.9 新增）
不想写代码，直接命令行：
```
# 基础爬取，输出 markdown
crwl https://www.nbcnews.com/business -o markdown

# 深度爬取，BFS 策略，最多 10 页
crwl https://docs.crawl4ai.com --deep-crawl bfs --max-pages 10

# 用 LLM 抽取，针对一个问题
crwl https://www.example.com/products -q "Extract all product prices"
```

## 用 LLM 做结构化抽取
这是它最“AI 原生”的能力。定义一个 schema，让它从页面里抽你要的字段，直接出 JSON。不用写一堆正则和选择器，描述清楚你要什么，LLM 帮你抽。

## 适合谁用？
如果你满足下面任意一条，值得用：
- 做 RAG 应用，需要把网页变成干净的上下文
- 做 AI agent，需要实时抓取网页作为工具
- 做数据管道，需要大规模、可控的网页抓取
- 受够了现成爬虫的清洗和噪音问题
- 需要登录态、代理、反爬绕过的复杂场景

如果你只是偶尔抓一个静态页面，requests + BeautifulSoup 可能就够，用不上它的全部能力。但凡你进入“给 AI 喂网页数据”的场景，crawl4ai 这种“LLM 友好”的设计能省掉大量后处理工作。


---

> 作者: XiongNeng  
> URL: https://xiongneng.me/posts/ai/crawl4ai/  

