字数:约 4800 字 | 阅读时间:14 分钟
做 AI Agent 开发的人都知道,网页抓取是绕不开的基础能力。你的 Agent 需要读文档、搜新闻、查资料、监控竞品——每一项都依赖「把网页变成结构化数据」这个动作。
目前市面上最流行的方案是 Firecrawl,但问题是:贵。Hobby 计划每月十九美元只有三千个额度,一个稍微认真的 Agent 项目几天就能烧完。更不用提批量抓取或者高频监控,成本直接起飞。
八月初,一个叫 Draco 的开源项目出现在 Hacker News 首页,获得不少社区关注。它是用纯 Rust 写的单二进制网页抓取工具,Firecrawl 的 API 完全兼容,零成本自托管,而且内置了 MCP 服务器,可以直接被 Claude Code、Hermes Agent 等 AI 编程工具调用。
这篇文章带你从零部署 Draco,接入你的 Agent 工作流,彻底告别网页抓取的月费账单。
▲ 图1
一、Draco 的核心能力
Draco 的设计哲学是:不做万能工具,只做好一件事——把 HTML 变成干净的 Markdown,但把这件事做到极致。它的核心卖点就四个:
第一,单二进制,零运行时依赖。 不需要安装 Node.js,不需要维护 Chrome 浏览器舰队,不需要 Redis 做任务队列。一个可执行文件,下载即用。这对于追求「一人公司」技术栈的独立开发者来说,意味着极低的运维负担。
第二,Firecrawl API 完全兼容。 现有的 Firecrawl SDK 代码不用改,把请求地址从 api.firecrawl.dev 改成本地 127.0.0.1:3002 就能跑。对于已经用 Firecrawl 做了集成的项目,迁移成本几乎为零。
第三,隐身抓取能力。 Draco 使用 JA4 TLS 指纹伪装成真实浏览器,配合代理使用可以访问有基础反爬保护的网站。虽然它不能突破 Cloudflare 这类 JS 挑战墙,但对于大多数技术博客、新闻网站、文档站点来说足够了。
第四,原生 MCP 集成。 Draco 内置了 Model Context Protocol 服务器,可以作为 Claude Desktop、Claude Code 等工具的标准 MCP 工具使用。这意味着你的 AI 编程助手可以直接调用 Draco 去抓取任何网页,不需要写一行胶水代码。
从技术架构看,Draco 分为五个核心模块:
| 模块名称 | 核心职责 | 技术要点 |
|---|---|---|
draco-net | 网络层 | 基于 wreq 和 BoringSSL 的隐身 HTTP 客户端,JA4 指纹、Cookie 管理、代理支持、自动退避重试 |
draco-static | 静态提取 | 与 Firecrawl 同等质量的 Markdown 提取引擎,含元数据解析、Open Graph 标签提取 |
draco-runtime | 动态渲染 | 内嵌 V8 隔离沙箱,在内存中执行 JS 后提取内容,不需要真实浏览器 |
draco-core | 协调层 | 升级状态机(静态→动态→回退)、挑战页面检测、API 请求重放 |
draco-cli | 命令行 | 统一的 CLI 接口和输出格式 |
简单说:静态页面通过 draco-static 处理(大约三百毫秒完成),SPA 应用通过 draco-runtime 处理(在 V8 沙箱里执行 JavaScript 后再提取),整个过程不启动真实浏览器,内存和 CPU 开销都很可控。
二、五分钟上手
安装方式
官方提供了一键安装脚本,适合 Linux 和 macOS:
脚本会自动检测操作系统和 CPU 架构,下载对应二进制文件并配置环境变量。执行完成后,draco 命令即可用。
如果习惯从源码编译,也很简单:
编译依赖包括:C 语言编译器、CMake、Clang 和 libclang。Ubuntu 或 Debian 系统用以下命令安装:
对于只需要静态页面抓取的场景(不需要 SPA 动态渲染),可以编译精简版本,不链接 V8 引擎和 HTTP 框架:
精简版的二进制文件更小,内存占用更低,适合在资源受限的 VPS 上长期运行。
第一次抓取
执行后,标准输出是一份干净的 Markdown 文件。来看看实际效果——抓取一篇技术博客:
加上 --json 参数可以获得完整的数据结构:
返回的数据格式如下:
注意 timing 字段——从发起请求到输出 Markdown,总计不到两百毫秒。相比之下,Firecrawl 的远程 API 调用光网络往返就超过一秒。对于需要高频抓取的 Agent 场景,这个速度差异会累积成显著的体验差距。
三、Daemon 模式:无缝替换 Firecrawl
Draco 最实用的功能是 draco serve,它启动一个与 Firecrawl 完全兼容的 HTTP API 服务。
启动服务
服务启动后,GET /health 可以验证健康状态:
兼容的 API 端点一览
Draco daemon 实现了 Firecrawl 的核心端点,同时增加了一些特有的扩展:
| 端点 | 方法 | 功能 | 与 Firecrawl 兼容性 |
|---|---|---|---|
/v1/scrape | POST | 单页抓取,返回 Markdown | 完全兼容 |
/v1/crawl | POST | 异步站点爬取,支持深度控制和路径过滤 | 完全兼容 |
/v1/map | POST | URL 发现,合并站点地图和页面链接 | 完全兼容 |
/v1/batch/scrape | POST | 批量多 URL 异步抓取 | 完全兼容 |
/v1/search | POST | 多引擎并行搜索,支持自动抓取搜索结果页 | Draco 独有 |
/v1/discover | POST | 发现 SPA 应用背后的 JSON API 端点 | Draco 独有 |
/v1/interact | POST | 有状态页面交互,支持执行 JS 和页面导航 | Draco 独有 |
用 curl 测试单页抓取
返回结果与 Firecrawl 格式完全一致:
迁移现有 Firecrawl 项目
如果你已经在用 Firecrawl 的 Python 或 Node.js SDK,迁移只需要改一行配置:
Firecrawl SDK 中 Draco 不识别的字段(如 onlyMainContent、waitFor、actions)会被接受并静默忽略,不会导致请求失败。这种「宽容接受、严格输出」的策略保证了迁移的平滑性。
四、MCP 集成:让你的 AI 编程助手能上网
对 AI Agent 开发者来说,这是 Draco 最核心的价值——原生 MCP 服务器。配置完成之后,Claude Code 或 Claude Desktop 可以直接把「抓取网页」当成内置工具来用。
▲ 图2
配置 Claude Desktop
编辑 Claude Desktop 的配置文件,通常位于:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
添加以下内容:
配置 Claude Code
在终端中一行命令搞定:
MCP 提供的能力清单
Draco 通过 MCP 协议暴露了三个只读工具,全部标注了 read-only 权限:
| 工具名称 | 功能描述 | 关键参数 |
|---|---|---|
draco_scrape | 抓取网页并返回 Markdown 或 JSON | url、formats(支持 markdown、json、endpoints)、tierMax(渲染层级,0-2)、timeout |
draco_discover | 分析 SPA 应用,发现其背后 JSON API 端点 | url、captureWindowMs(捕获窗口时长,毫秒) |
draco_search | 并行搜索多个搜索引擎,返回合并结果 | query、limit(1-100)、tbs(时间过滤)、formats(是否同时抓取结果页) |
如果你用的是 Draco 的 daemon 模式,还会额外获得四个交互工具:draco_interact_open(打开有状态页面会话)、draco_interact_exec(在页面中执行任意 JavaScript 并获取返回值)、draco_interact_navigate(携带 Cookies 进行页面导航)、draco_interact_scrape(将当前 DOM 提取为 Markdown)。这些工具让你的 Agent 可以像人类一样浏览网页——打开页面、点击链接、填写表单、提取内容。
实际使用场景
在 Claude Code 中配置好 Draco MCP 后,你可以直接这样说:
帮我看看 Draco 项目的最新 README,对比一下它的 MCP 功能和 Firecrawl 的 MCP 功能有什么区别。
Claude Code 会自动调用 draco_scrape 工具去抓取 GitHub 上 Draco 的 README 页面,然后再调用它去抓取 Firecrawl 的文档页面,最后综合两份内容给出对比分析。整个过程你不需要离开终端,不需要手动打开浏览器,甚至不需要知道这两个网页的 URL——Agent 会自己找到正确的页面。
五、高级功能实战
5.1 SPA 页面处理:告别「空白抓取」
很多现代网站(React、Vue、Next.js 构建的应用)的 HTML 只是一个空壳——真正的数据在浏览器执行 JavaScript 之后才加载。传统抓取工具遇到这类页面会返回一个只有 的空文件。
Draco 内置的 V8 隔离沙箱专门解决这个问题:
--runtime-log 会输出非常详细的诊断信息,包括每次 fetch 和 XHR 请求的方法、URL、状态码,JavaScript 异常和 console.error 输出,模块和代码块加载失败的原因,以及捕获窗口关闭的时间点和触发条件。这些信息对于调试「为什么某个页面抓出来是空的」至关重要。
对于纯客户端渲染应用(HTML 里只有一个根节点,所有内容都从 JSON API 动态加载),Draco 还有一个绝招——Render 模式。在这种模式下,V8 沙箱会把页面的数据请求(GET 和只读 POST)真正发出去,让页面框架走完它的成功路径,等 DOM 稳定后再提取内容。只有状态变更请求(PUT、DELETE 等)会被拦截。
5.2 API 端点发现
这个功能对于需要对接第三方数据源的 Agent 特别有用。很多 SaaS 产品的网页是空的,真正的数据通过 JSON API 加载。Draco 的端点发现可以帮你找到这些隐藏的接口:
返回结果会列出 V8 沙箱拦截到的所有网络请求,按「这是真实数据接口」的可能性从高到低排序:
评分高于八十分的端点基本可以确定是真正的数据接口。replayable: true 表示这个接口可以直接用 Draco 的隐身客户端重放,拿到相同的数据。分析埋点和静态资源请求自动排在最后,不会干扰判断。
5.3 多引擎搜索
Draco 的搜索功能不是简单封装第三方搜索 API,而是直接用自己的隐身 HTTP 客户端并行查询多个搜索引擎,然后用 Reciprocal Rank Fusion 算法合并排序结果:
返回结果会附带每个搜索引擎的状态:
支持的后端包括:DuckDuckGo、Bing、Brave、百度、ZapMeta、Yandex。关键设计是容错:某个引擎被验证码拦截或者地区封锁了,其他引擎照常工作。只有所有引擎全部失败时才返回错误。
加上 --format markdown 参数,Draco 在搜索完成后会对每个结果 URL 执行抓取,把正文 Markdown 直接合并到搜索结果中:
这样一次调用就完成了「搜索关键词→获取结果列表→抓取每个结果页的正文」三步操作。对于 Agent 的情报收集和竞品分析场景,省去了写循环和异常处理的繁琐代码。
5.4 批量抓取和 Webhook 回调
对于大规模数据采集任务,Daemon 模式支持异步批量操作:
批量抓取会并行处理(并发数受 --max-concurrency 控制),大幅缩短总耗时。如果你需要事件驱动的处理方式,可以用 Webhook:
Webhook 会触发四种事件:任务开始、单页完成、全部完成、任务失败。每次回调携带完整的抓取结果,采用十秒超时加三次递增重试策略,适合构建事件驱动的数据处理流水线。
六、实战:构建 Agent 网页监控系统
下面是一个完整的使用案例。用一个 Python 脚本配合 Draco Daemon,每天自动搜索 AI 相关关键词,抓取搜索结果页,提取摘要,生成日报。
▲ 图3
步骤一:启动 Draco 服务
步骤二:编写监控脚本
步骤三:输出效果
一个关键词搜出了五个高质量结果,每个结果都附带正文前两百字。整个流程从发起请求到输出日报,不到十秒。
七、踩坑记录
以下是我在实际部署和测试中遇到的关键问题:
坑一:SPA 页面抓出来只有一两行
表现:抓取 React 或 Next.js 页面后,返回的 Markdown 里只有一个根节点或者「Loading...」。
原因:页面内容完全依赖客户端渲染。虽然 Draco 默认会自动升级到 Tier 2 动态渲染,但某些情况下渲染时间不够,捕获窗口太早关闭。
排查方法:用 --runtime-log 查看 V8 沙箱内部的详细执行日志。
日志里如果看到「capture window closed before content stabilized」,说明需要增加等待时间:
另一个常见原因:页面需要登录认证,数据请求带了 Cookie 但 Draco 的沙箱没有。这种情况需要用 draco interact 模式先登录,再提取。
坑二:编译报错——找不到 BoringSSL
表现:cargo build 时报错,提示 BoringSSL 或 libclang 相关依赖缺失。
原因:Draco 的网络层基于 wreq 库,wreq 依赖 BoringSSL 进行 TLS 指纹伪装。
解决:确保安装了完整的构建依赖。
对于国内网络环境,Cargo 拉取依赖可能很慢。配置镜像加速:
坑三:生产环境内存持续增长
表现:draco serve 运行几小时后,内存占用从几百兆涨到几个 G。
原因:Draco 的 V8 沙箱内置了一个脚本块缓存(默认 512 MiB 内存 + 2 GiB 磁盘),用于缓存 SPA 的 JavaScript 代码块,避免重复抓取时重复下载。在高频抓取场景下,缓存逐渐填满。
解决方案:
- 如果不需要 SPA 渲染功能,编译精简版:
cargo build -p draco-cli --no-default-features - 生产环境建议分配 2-4 GB 内存
- 使用
--max-concurrency限制并发数,比如--max-concurrency 4 - 定期重启 daemon(可以写一个 crontab 每天凌晨重启)
坑四:Draco 不能替代 Firecrawl 的全部功能
虽然 Draco 的 API 兼容 Firecrawl,但它不是一一对应的替代品。以下是明确不支持的功能:
| 功能 | Firecrawl | Draco |
|---|---|---|
| 页面截图 | 支持 | 不支持,也不打算支持 |
| 原始 HTML 输出 | 支持 | 不支持(只输出 Markdown 或 JSON) |
| JS Challenge 绕过 | 部分支持 | 明确不做 |
actions 交互指令 | 支持 | 部分支持(需用 interact 模式替代) |
如果你的工作流依赖截图或原始 HTML,Draco 当前无法替代 Firecrawl。 反之,如果你只需要「干净的 Markdown 正文」,Draco 完全可以胜任,而且性能更好。
八、成本对比
最后算一笔账。假设一个 AI Agent 项目每天需要抓取两百个网页(这是中等规模项目的典型需求):
| 对比维度 | Firecrawl | Draco 自托管 |
|---|---|---|
| 月费 | 九十九美元(Standard 计划,一万额度) | 零美元(自己服务器) |
| 年费 | 约一千二百美元 | 约六十美元(五美元月付的 VPS) |
| 日均抓取上限 | ~333 页 | 理论上无限(受服务器性能限制) |
| 单页抓取延迟 | 五百到两千毫秒(远程 API 加网络往返) | 一百到三百毫秒(本地 daemon) |
| 数据隐私 | 网页内容经过第三方服务器 | 全部在本地处理 |
| Credits 消耗透明度 | 黑盒(SPA 页面额外计费不透明) | 完全透明(CPU、内存、带宽) |
一年下来,节省比例超过百分之九十五。 更重要的是,Draco 让你对自己的抓取管道的成本和性能有了完全的掌控。不需要担心某个 SPA 页面突然消耗十个 credits,也不需要担心 API 配额在月中用光。
总结
Draco 是一个设计精良的工具。它不贪大求全,只是把「HTML 到 Markdown」这一件事做到极致——快、轻、兼容、可集成。
对于 AI Agent 开发者来说,Draco 的价值不只是省钱:
第一,数据隐私——所有抓取在本地完成,敏感的竞品分析数据和内部文档不会经过第三方 API 服务器。
第二,低延迟——本地 daemon 的响应时间远低于远程 API,对于实时性要求高的 Agent 应用(比如对话中即时查资料),体验差异十分明显。
第三,可定制——开源代码可以根据业务需求修改。比如增加特定网站的专用内容提取器,或者接入自定义的反爬策略。
第四,MCP 原生——不需要额外的适配层或中间件,直接用标准 MCP 协议接入 Claude Code 或 Hermes Agent。这个设计非常聪明,它让 Draco 从「一个工具」变成了「Agent 的一个器官」。
Draco 还比较年轻,部分功能不如 Firecrawl 成熟。但如果你正在做 AI Agent 开发,不妨试试——把 Firecrawl SDK 的 api_url 指向 ` Firecrawl 的存在。
最后说一句体会:做 AI Agent 开发,基础设施的成本容易被忽视。Firecrawl 一个月十几美元看起来不多,但加上 LLM API 调用费、云服务器、向量数据库,杂七杂八加起来一个月三五百美元很正常。Draco 这类自托管工具的真正价值不在于「省掉某个服务的订阅费」,而在于让你能用更低的试错成本去验证更多想法。当网页抓取不再是一笔月费的时候,你会发现自己愿意做更多尝试——而尝试的次数,往往决定了最终找到正确方向的概率。
如果你觉得有用,欢迎分享给身边做 AI Agent 的朋友。
*参考来源:Draco GitHub 仓库 | Hacker News 讨论*
本文由AI辅助创作,经人工审核编辑发布
更多一人公司案例与工具,微信搜索「AI创业内参」关注我们