做 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
夜雨聆风