6 min de lectura

Draco lleva el scraping web sigiloso a un binario Rust

Draco es un extractor web de un solo binario alojable localmente escrito en Rust con huellas TLS sigilosas, hidratación de SPAs, extracción JSON y un daemon compatible con Firecrawl.

Imagen: Hacker News

Draco es un extractor web autocontenido en un único binario escrito en Rust que apunta al mismo caso de uso general que Firecrawl y Browserbase: envíale una URL y recibe Markdown limpio, metadatos o datos estructurados. Su distinción clave es una huella TLS/JA4 fiel a la de un navegador, diseñada para acceder a sitios que bloquean clientes HTTP ordinarios sin requerir una flota de navegadores sin cabeza (headless).

El proyecto está disponible en github.com/0xchasercat/draco. La vía de instalación más rápida en Linux o macOS es:

''sh curl -fsSL https://raw.githubusercontent.com/0xchasercat/draco/main/install.sh | sh ''

El script detecta el sistema operativo y la arquitectura, descarga el binario más reciente y añade Draco a ~/.zshrc, ~/.bashrc o ~/.config/fish/config.fish. Un scraping básico escribe Markdown en la salida estándar:

Recomendado

Apple Upgrade se lanza mientras llega iOS 26.6

''sh draco scrape https://example.com ''

Extracción basada en Rust sin una flota de navegadores

Para una página HTML estándar, Draco realiza una única obtención y análisis con huella en típicamente unos 300 ms, sin iniciar un navegador. Su canal de Markdown refleja el enfoque de Firecrawl: extracción determinista del contenido principal seguida de una conversión equivalente a Turndown/GFM, implementada de forma nativa en Rust.

La salida puede incluir:

  • Markdown limpio con encabezados, enlaces absolutizados, listas, citas en bloque, bloques de código delimitados con etiquetas de idioma y tablas GFM
  • Eliminación de la navegación, cabeceras, barras laterales, pies de página, anuncios, scripts, estilos e imágenes en base64
  • Metadatos que incluyen el título, la descripción, el idioma, la URL canónica, el favicon, todas las etiquetas og:, twitter: y article:*, además de sourceURL, statusCode y contentType
  • Información de trazas y tiempos que muestra qué pasos de procesamiento se ejecutaron y cuánto tardaron

La interfaz de línea de comandos también admite HTML, HTML crudo, enlaces, JSON, endpoints y salida combinada Markdown más JSON. Las opciones incluyen proxies, retardos, timeouts, extracción por JSONPath, espera de render, exclusiones de robots y registro en tiempo de ejecución.

''sh draco scrape https://example.com --json --pretty draco scrape https://example.com --proxy socks5://127.0.0.1:9050 --delay 500 ''

Los códigos de salida son 0 para éxito, 1 para un error, 2 para un objetivo no soportado y 3 cuando se necesita un navegador.

Cómo Draco maneja las SPAs renderizadas por el cliente

Draco no trata a los sitios con mucho JavaScript como un flujo de trabajo distinto de scraping basado en navegador. Si el HTML inicial contiene poco contenido significativo, puede hidratar la página en un aislado V8 dentro del mismo proceso, serializar el DOM en vivo, combinar el <head> original con el <body> hidratado y ejecutar de nuevo la misma canalización de extracción de contenido.

El aislado se restaura a partir de una instantánea del motor DOM generada en tiempo de compilación en milisegundos de un solo dígito. Draco lo describe como un mecanismo de descubrimiento más que como un renderizador: el JavaScript de la página no tiene enlaces al host y no puede realizar E/S. La actividad de red, en cambio, es intermediada por el motor.

Para SPAs puramente renderizadas por el cliente sin estado embebido, Draco puede observar las solicitudes realizadas durante la hidratación e identificar la API que suministra los datos de la página. En su modo Render, recupera solicitudes de datos seguras en vivo mediante el mismo cliente sigiloso y un almacén de cookies compartido. Eso incluye GET y HEAD, así como solicitudes POST y PUT de solo lectura con formato tipo GraphQL o JSON-RPC.

Las solicitudes que cambian estado permanecen simuladas a menos que se suministre --allow-unsafe-replay. Los endpoints de streaming y los beacons de analítica nunca se solicitan en vivo. La ventana de captura se cierra una vez que la actividad de contenido se estabiliza, con un tope máximo como respaldo.

Se admiten scripts externos y módulos ES, incluyendo import() e importaciones dinámicas. Los recursos de script se obtienen concurrentemente mediante un cliente sigiloso agrupado y se almacenan en una caché inmutable global al proceso limitada a 512 MiB de RAM y 2 GiB de disco. Si la hidratación no mejora una página, Draco vuelve a la copia estática en lugar de fallar.

El proyecto también detecta pantallas esqueleto cuyo contenido aún está marcado “Loading…”, incluso cuando la página contiene una cantidad sustancial de chrome de interfaz. Esas líneas de marcador se eliminan del resultado.

Extracción JSON escalonada y API compatible con Firecrawl

El modo opcional --format json de Draco escala a través de métodos de extracción progresivamente más costosos:

  • Estado estático embebido como __NEXT_DATA__, JSON-LD y window.__NUXT__
  • Reproducción directa de un endpoint JSON de Next.js con build-ID en /_next/data/<buildId>/…​.json
  • Intercepción en tiempo de ejecución en V8, seguida de la clasificación y reproducción del endpoint de datos más probable

El mismo mecanismo impulsa el descubrimiento de endpoints. --format endpoints devuelve un catálogo clasificado de APIs interceptadas con su método, URL, puntuación, capacidad de reproducción y encabezados. Los beacons de analítica y los recursos estáticos se clasifican por debajo de las APIs de datos probables.

Draco también puede ejecutarse como un demonio persistente:

''sh draco serve ''

Por defecto escucha en http://127.0.0.1:3002, el puerto por defecto de Firecrawl. El demonio expone una API REST compatible con Firecrawl, incluyendo POST /v1/scrape, de modo que los clientes existentes de Firecrawl pueden apuntar a él sin cambios. Soporta los formatos Markdown y JSON; las solicitudes para HTML, HTML crudo, enlaces o capturas de pantalla son rechazadas con una respuesta 400 clara porque Draco todavía no produce esos formatos.

El demonio además proporciona:

  • POST /v1/map para descubrimiento de URLs del mismo host usando sitemaps y enlaces de página
  • POST /v1/crawl para rastreos BFS limitados y asíncronos en el mismo host
  • POST /v1/batch/scrape para lotes paralelos de URLs
  • Webhooks para eventos del ciclo de vida de rastreos y lotes, con reintentos tras 1, 5 y 15 minutos
  • POST /v1/discover para descubrimiento y reproducción de APIs clasificadas
  • POST /v1/search y draco search para búsqueda web multi-motor

Los rastreos tienen por defecto un límite de 10 páginas y una profundidad máxima de 2, con un límite absoluto de 100 páginas. La concurrencia está limitada por --max-concurrency, cuyo valor por defecto es 8. Los trabajos de Nivel 2 usan aislados nuevos, mientras que --isolate-pool-size controla la ejecución concurrente de aislados y por defecto se dimensiona automáticamente aproximadamente al número de CPUs.

Requisitos de compilación y detalles abiertos

Los usuarios pueden instalar un binario precompilado o compilar Draco con Cargo:

''sh git clone https://github.com/0xchasercat/draco cd draco cargo build --release ''

Los prerequisitos de compilación incluyen CMake, un compilador C/C++, Clang/libclang, Perl y pkg-config; V8 solo es necesario para el modo JSON opcional. Los usuarios de Debian y Ubuntu necesitan build-essential cmake clang libclang-dev perl pkg-config, mientras que los usuarios de Fedora necesitan gcc gcc-c++ cmake clang clang-devel llvm-devel perl pkgconf. macOS requiere Xcode Command Line Tools y brew install cmake.

El repositorio no especifica precios ni una fecha de lanzamiento separada. Su benchmark local reporta una hidratación de SPA en proceso caliente de aproximadamente 150 ms de extremo a extremo, cubriendo fetch, hidratación, serialización y conversión a Markdown.

Tomas Berg

Computing Editor

Tomas lives in the terminal. He covers chips, laptops, and operating systems with a focus on performance and efficiency. He reads kernel changelogs the way other people read fiction, and he's always on the hunt for the perfect mechanical keyboard switch. If it processes data, Tomas has an opinion on it.

vía Hacker News

/ Sigue leyendo