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 认证
  • 可扩展架构:为大规模生产设计
  • 云部署:主流云平台都有现成配置

安装

1
2
3
pip install -U crawl4ai
crawl4ai-setup      # 装浏览器
crawl4ai-doctor     # 验证安装

装完跑一个最简单的爬取:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 新增)

不想写代码,直接命令行:

1
2
3
4
5
6
7
8
# 基础爬取,输出 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 友好”的设计能省掉大量后处理工作。