显示 HN:Draco - 一个可自托管的单二进制 Firecrawl 替代品,使用 Rust 开发
一个快速、隐蔽的、原生 Rust 网页抓取器 - Firecrawl / Browserbase 的更轻替代方案。将其指向一个 URL,返回干净的 Markdown + 元数据,使用与浏览器一致的 TLS/JA4 指纹访问阻止普通客户端的网站。无需 Node,无需无头 Chrome 实例,无需每次请求启动浏览器。安装 Draco 的最快方式是在 Linux 或 macOS 上使用安装脚本:curl -fsSL https://raw.githubusercontent.com/0xchasercat/draco/main/install.sh | sh (这将自动检测你的操作系统/架构,下载最新的二进制文件,并将其添加到你的 ~/.zshrc 、 ~/.bashrc 或 ~/.config/fish/config.fish 中)然后尝试抓取一个页面:draco scrape https://example.com # → 将干净的 Markdown 输出到标准输出 对于标准 HTML 页面,这是一次单指纹获取 + 解析 - 通常约 ~300 毫秒,无需浏览器 - Markdown 管道与 Firecrawl 的类似(确定性主内容提取 + 一个 Turndown/GFM 等价转换器),在 Rust 中原生实现。客户端渲染的单页应用(只有在 JavaScript 运行后内容才会出现)也得到处理,通过 render-then-Markdown - 无需无头浏览器实例。你将获得 Markdown - 页面的主要内容以干净的 Markdown 形式显示:标题、链接(绝对化)、列表、引用、围栏代码块(带语言)和 GFM 表格。样板(导航/页眉/侧边栏/页脚/广告)被剥离,脚本和样式不会泄露,base64 图片会被省略。元数据 - 标题、描述、语言、规范链接、图标、每个 og:* / twitter:* / article:* 标签,以及 sourceURL、statusCode、contentType。跟踪 + 时间 - 精确的步骤运行情况和毫秒去向。安装/构建 git clone https://github.com/0xchasercat/draco && cd draco cargo build --release 构建前提条件(对于 wreq 的 BoringSSL + bindgen,以及 V8,仅适用于可选的 json 模式):cmake、一种 C/C++ 编译器、clang / libclang、perl、pkg-config。Debian/Ubuntu:apt install build-essential cmake clang libclang-dev perl pkg-config Fedora:dnf install gcc gcc-c++ cmake clang clang-devel llvm-devel perl pkgconf macOS:Xcode 命令行工具 + brew install cmake 用法 # 默认:URL → Markdown 输出到标准输出(适合管道) draco scrape https://example.com > page.md # 完整信封(markdown + 元数据 + 跟踪)作为 JSON draco scrape https://example.com --json --pretty # 隐蔽 + 礼貌 draco scrape https://example.com --proxy socks5://127.0.0.1:9050 --delay 500 退出代码: 0 成功 · 1 错误 · 2 不支持 · 3 需要浏览器。可选:JSON-API 提取( --format json ) 除了 Markdown,Draco 可以从其自己的 API 提取单页应用加载的结构化数据 - 这是一个强大的功能,适用于数据驱动的网站。它通过生成数据的最低层次进行升级:静态嵌入状态 - __NEXT_DATA__,JSON-LD,window.__NUXT__。Next.js build-id 重放 - 直接获取 /_next/data/<buildId>/….json。运行时拦截 - 启动一个进程内的 V8 isolate(从构建时 DOM 引擎快照中恢复,在单数毫秒内,JIT 开),让页面的 JavaScript 水合,拦截其数据所触发的 fetch / XHR,给拦截排名,并用隐蔽客户端重放赢家。这个 isolate 是发现神谕,不是渲染器 - 数据请求通过合成存根回答,页面 JavaScript 没有主机绑定:它无法执行 I/O。 draco scrape https://app.example.com --format json --pretty # data[] draco scrape https://app.example.com --format json --extract ' $.props.pageProps ' draco scrape https://app.example.com --format both # markdown + 数据 标志: --format <markdown|html|raw-html|links|json|endpoints|both>(可重复;默认 markdown;both = markdown + json), --json , --extract <JSONPATH> , --no-main-content , --wait-for <ms> , --tier-max <0|1|2> , --proxy , --delay <ms> , --timeout <ms> , --capture-window-ms <ms> , --ignore-robots , --allow-unsafe-replay , --runtime-log , --pretty。( --no-jail / --strict-sandbox 仍然接受以保持兼容,且无效 - 见安全模型。)调试一个水合为空的页面? --runtime-log(在 discover 上也有,并作为 runtimeLog 在守护进程/MCP 上)显示 isolate 的页面侧诊断 - 已吞噬的异常、console.error 行、每个调解的抓取( [raze.fetch] METHOD URL → STATUS (bytes, live|stub))、失败的块/模块加载,以及捕获窗口关闭的原因/时间 - 所有时间戳 [+ms] 从捕获开始,这样跟踪就呈现为时间轴:浏览器开发工具的可见性,而无需浏览器。客户端渲染的单页应用 → Markdown(render-then-Markdown) 一些页面在 JavaScript 运行后才渲染其内容 - 抓取的 HTML 只是一个薄壳(一个空的 <div id="root">)。Draco 自动处理这些:当初始解析发现几乎没有内容且允许 Tier 2(默认)时,它在同一进程内的 V8 isolate 中水合外壳,序列化实时 DOM,拼接外壳的真实 <head>(标题/Open Graph/规范链接)到水合的 <body> 上,并对其重新运行完全相同的内容引擎。你将获得来自客户端渲染的
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡