乐于分享
好东西不私藏

crawl4ai:7.2 万星,GitHub 最火的爬虫,专为 LLM 而生

crawl4ai:7.2 万星,GitHub 最火的爬虫,专为 LLM 而生

做 AI 应用的人,迟早都会撞上同一个问题--

喂给模型的数据从哪来?

模型自己不会上网。你要给它知识,就得先去网上抓内容、清洗、转成它能吃的格式。

而网页抓取这件事,从来都不简单:动态加载、反爬、登录态、表格、分页、JS 渲染……每个都是坑。

有人专门为 LLM 场景做了一个爬虫,把抓取到的网页直接转成干净的 Markdown。

这个项目叫 crawl4ai,目前 GitHub 7.2 万星,是 GitHub 上 star 最多的爬虫,作者是 unclecode。

今天这篇,我们就用一篇公众号文章,把 crawl4ai 讲清楚:

○  它到底是什么

○  为什么“LLM 友好”这么重要

○  默认能做什么

○  怎么用

○  适合谁

它到底是什么?

一句话版:

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 抽取”,这个体验在爬虫里算很顺的了。

用 LLM 做结构化抽取

这是它最“AI 原生”的能力。定义一个 schema,让它从页面里抽你要的字段,直接出 JSON。

不用写一堆正则和选择器,描述清楚你要什么,LLM 帮你抽。

安全这点值得一提

crawl4ai 最近几个版本在密集做安全加固。

v0.9.0 是个“安全默认”大版本:

○  Docker API server 默认开启认证

○  默认只绑定 loopback(本地),除非给 token

○  请求体被当成不可信边界处理

v0.8.7 修了一堆关键漏洞:RCE、SSRF、认证绕过、文件写入、XSS、硬编码 JWT secret。

也就是说,作者在认真对待“爬虫工具本身别变成攻击面”这件事。如果你之前用过老版本,建议升到最新。

适合谁用?

如果你满足下面任意一条,值得用:

○  做 RAG 应用,需要把网页变成干净的上下文

○  做 AI agent,需要实时抓取网页作为工具

○  做数据管道,需要大规模、可控的网页抓取

○  受够了现成爬虫的清洗和噪音问题

○  需要登录态、代理、反爬绕过的复杂场景

如果你只是偶尔抓一个静态页面,requests + BeautifulSoup 可能就够,用不上它的全部能力。

但凡你进入“给 AI 喂网页数据”的场景,crawl4ai 这种“LLM 友好”的设计能省掉大量后处理工作。

最后一句

crawl4ai 戳中的是一个很真实的需求:

AI 应用最缺的,从来不是模型,而是干净的数据。

模型再强,喂一坨带广告和导航栏的 HTML,也读不出个所以然。

crawl4ai 把“抓网页 -> 转干净 Markdown -> 喂模型”这条链路打通,还把 LLM 抽取、深度爬取、反爬、崩溃恢复这些工程难点都做了--

开源、Apache 协议、不设门槛,这也是它能冲到 7.2 万星的原因。

如果你正在做需要网页数据的 AI 应用,crawl4ai 几乎是绕不开的那个选项。

如果这篇对你有帮助,欢迎点个在看。 也可以留言聊聊:你做 AI 应用时,网页数据是怎么抓的,最痛的是哪一步?

参考资料/来源

official

○  https://github.com/unclecode/crawl4ai

○  https://cdn.jsdelivr.net/gh/unclecode/crawl4ai@main/README.md

○  https://docs.crawl4ai.com

○  https://pypi.org/project/crawl4ai/

reference

○  https://github.com/unclecode/crawl4ai/blob/main/docs/blog/release-v0.9.0.md

○  https://trendshift.io/repositories/11716