84 estrellas en GitHub y la cifra sigue aumentando. Yozh Crawler + Scraper es gratuito, de código abierto y se desarrolla de forma pública; danos una estrella si se gana un hueco en tu pila de herramientas.
CyberYozh Data / Casos de uso / Extracción de datos web y análisis
Caso de uso · Extracción de datos de la web

Datos web públicos, estructurados para SQL

Importa cualquier página pública o todo un sitio web a tu almacén de datos en formato JSON limpio: ofertas de empleo, noticias, reseñas, catálogos y perfiles públicos. Yozh se encarga de los selectores, la protección contra bots, los reintentos y los proxies; tus cargadores solo tienen que añadir los datos a Snowflake, BigQuery o Postgres.

$curl -s :8000/api/v1/scrape/batch -d @urls.json | jq -c '.results[]' | psql -c "COPY raw FROM stdin"
batch: g2.com/products
Target table
scraped_pages
Batch
200 urls 8 workers 1.0/s
Status
streaming · 247 / 200 rows
Yozh batch /scrape/batch
Pulling URL batch
Stealth fetch + retry
Parsing & normalizing
Emitting JSON-lines
COPY FROM stdin
Canaliza hacia tu pila
Por qué se deterioran la mayoría de las canalizaciones

Los extractores de datos de creación propia consumen el 90 % del tiempo dedicado al análisis y generan datos de mala calidad

Un «pequeño script en Python» se convierte en meses de gestión de cookies, rotación de proxies, correcciones de selectores, colas de reintentos y alertas a las 3 de la madrugada porque la fuente ha cambiado el nombre de una clase. El equipo de datos se pasa todo el trimestre reconstruyendo la estructura básica en lugar de crear paneles de control. Ofrecemos las cuatro piezas que cada equipo reconstruye desde cero, listas para usar.

Si tu almacén tiene más nulls que filas tras un rediseño de la fuente, esto es para ti.

Los scrapers caseros, que se rompen con facilidad, se pudren en un cuarto de hora

El problema. Un script de Python creado un fin de semana se convierte en un motor interno poco robusto: una cola por aquí, una capa de reintentos por allá, sin observabilidad, un selector CSS que deja de funcionar cada vez que se rediseña el código fuente. El equipo se ve obligado a gestionar una infraestructura que nunca quiso desarrollar.

Cómo lo soluciona Yozh Scraper. Motor listo para producción: ejecutor de lotes en paralelo, reintentos automáticos con retroceso exponencial, códigos de error estructurados y autorreparación mediante LLM que regenera los selectores dañados a partir del DOM en tiempo real. Uno docker compose up sustituye a meses de código de enlace.

  • autorreparación por LLM
  • Lotes + reintentos
  • Errores estructurados

Código HTML desordenado en todas las fuentes

El problema. Cada sitio web genera su propia combinación única de elementos `div` anidados, bloques de datos JSON sin documentar y formatos de fecha inconsistentes. Tus cargadores necesitan un paso de normalización antes de llegar al almacén de datos, y ese paso es el primero en fallar cada vez que la fuente lanza un rediseño.

Cómo lo soluciona Yozh Scraper. Los ajustes predefinidos integrados garantizan un formato JSON idéntico en todas las fuentes: mismas claves, fechas en formato ISO y divisas normalizadas según la configuración regional. ¿Fuentes personalizadas? POST /api/v1/presets/generate Con una sola URL de ejemplo, un modelo de lenguaje grande (LLM) deduce el esquema y genera los selectores. Se integra directamente en COPY ... FROM stdin.

  • Mismo formato JSON
  • Fechas ISO
  • Presets generados por LLM

Las medidas contra los bots merman el sprint

El problema. Los proxies de los centros de datos se saturan en una sola sesión, los CAPTCHA bloquean los rastreos a mitad de tarea y el reconocimiento de huellas TLS detecta los navegadores sin interfaz gráfica en cuestión de segundos. Los ingenieros de datos acaban dedicando su tiempo a resolver bloqueos en lugar de crear paneles de control. Las facturas de los proxies se disparan mientras que el volumen de trabajo se estanca.

Cómo lo soluciona Yozh Scraper. Integración nativa con CyberYozh App Proxy a través de CYBERYOZH_API_KEY — 5 tipos de proxy (residencial rotativo/fijo, móvil 4G/5G, centro de datos, ISP) en 250 códigos de país. La versión «Stealth» de Chromium, con huella digital «warm», se adapta automáticamente al origen del proxy. La mayoría de los flujos nunca se encuentran con un CAPTCHA.

  • 5 tipos de proxy
  • 250 códigos de país
  • Fingerprint precalentado

Coordinación de rastreo ad hoc

El problema. «Recorrer esta web, extraer datos de todas las páginas de productos y estar atento a nuevas URL» es una tarea lógica, pero en código se traduce en una cola, una tabla de deduplicación, reglas de ámbito, límites de RPS y una cancelación en dos etapas. Si se implementa manualmente, falla ante los reintentos y vuelve a extraer datos de la misma URL sin avisar.

Cómo lo soluciona Yozh Scraper. Yozh Crawler recorre el sitio desde el lado del servidor, elimina duplicados mediante hash SHA1 por tarea, transmite las nuevas URL a través de SSE y, en cada coincidencia, las encadena al scraper. Cancelación en dos etapas (suave → forzada). Envía el flujo directamente a Airflow, dbt o cron: la orquestación se mantiene en las herramientas que ya utilizas.

  • Streaming SSE
  • Deduplicación por trabajo
  • Airflow / dbt / cron
Cómo funciona

De una página web en bruto a una fila en el almacén: en tres pasos

Un punto final que extraer, una forma que cargar. Conecta Yozh directamente a tu cargador, tu orquestador o tu almacén de datos actuales, sin necesidad de ninguna capa intermedia.

1 Pon en marcha el motor

Clona el repositorio y docker compose up. Scraper en :8000, rastreador en :8001. Sin cuenta SaaS, sin asistente de claves API: se ejecuta en tu VPC.

# one-time setup
git clone 
  github.com/CyberYozh-data/yozh-scraper
cd yozh-scraper
docker compose up -d
2 Extraer datos de una lista de URL de forma masiva

Envía tu lote de URL mediante POST (hasta 200 por llamada). Los workers se ejecutan en paralelo, y los reintentos y proxies se gestionan en el lado del servidor. El mismo formato JSON en todas las fuentes.

curl 
  localhost:8000/api/v1/scrape/batch 
  -X POST 
  -d '{"urls": ["…", "…"],
       "preset": "auto",
       "concurrency": 8}'
3 Directamente a tu almacén

Los resultados se muestran como líneas JSON. Envía los datos a jq a COPY ... FROM stdin en Postgres, o cárgalas directamente a través del cliente de Snowflake o BigQuery. Sin middleware.

# postgres example
curl :8000/api/v1/scrape/batch 
  -d @urls.json 
| jq -c '.results[]' 
| psql -c "COPY raw FROM stdin"
Ejemplo en vivo

Lo que obtienes a cambio: un único formato, para todos los mercados

Elige un ajuste preestablecido para ver cómo es la respuesta. El conjunto de campos varía según la fuente, pero la estructura de la solicitud es idéntica.


            
Recetas

Cómo lo organizan los equipos de datos: en 10 líneas cada uno

Tres canalizaciones desde la página hasta el almacén, listas para pegar. Yozh se encarga de la extracción de datos; tu orquestador se encarga de la programación.

1 Resumen diario → Postgres

Cron recupera una lista de URL, realiza un rastreo por lotes y envía líneas JSON directamente a una tabla provisional. dbt las recoge en la fase posterior del proceso.

# crontab: every day at 06:00
0 6 * * * /usr/local/bin/snapshot.sh

# snapshot.sh
curl -s :8000/api/v1/scrape/batch 
  -d "@urls.json" 
| jq -c '.results[]' 
| psql -c "COPY raw_scrape FROM stdin"

# dbt build runs next in Airflow DAG
dbt build --select staging.raw_scrape+
200 URLs/lote COPY FROM stdin tu cron / Airflow
2 Rastreo de descubrimiento → BigQuery

Realizar un rastreo del sitio web, incorporar nuevas URL a medida que se descubren. Eliminar duplicados respecto a los datos de ayer, extraer solo los cambios y añadir filas a BigQuery a medida que llegan.

# stream discovered URLs over SSE
curl -N :8001/api/v1/crawl/start 
  -d '{"seed_url":"site.com",
       "scope":"same-domain",
       "max_pages":1000}' 
| jq -r 'select(.event=="found") | .url' 
| comm -13 yesterday.txt - 
| bq insert dataset.urls --source_format=NEWLINE_DELIMITED_JSON
Streaming SSE deduplicación por trabajo (SHA1) inserciones solo de deltas
3 Flujo de noticias → Kafka

Rastrear y extraer datos de fuentes de noticias, y publicar cada artículo como un evento de Kafka. Los consumidores posteriores (cuadros de mando, modelos de análisis de opiniones, alertas) se suscriben por tema.

# 1. continuous crawl of source list
curl -N :8001/api/v1/crawl/start 
  -d "@sources.json" 
| jq -c 'select(.event=="scraped") | .result' 
| kcat -P -t news.raw -b kafka:9092

# 2. consumers subscribe downstream
kcat -C -t news.raw | your-pipeline
cadena de scraping + publicación Productor Kafka un topic por fuente
FAQ

Preguntas frecuentes sobre la entrada en un almacén

¿Qué fuentes puedo rastrear?
Cualquier página pública. Los ajustes predefinidos integrados cubren las de mayor tráfico: mercados online, motores de búsqueda, YouTube y perfiles de LinkedIn (con sesiones). Para fuentes personalizadas, llama a POST /api/v1/presets/generate con una URL de ejemplo: un modelo de lenguaje grande (LLM) deduce el esquema y genera los selectores, y obtienes una configuración predefinida reutilizable en cuestión de segundos. Para páginas puntuales, POST /scrape/page con un esquema explícito extract: {...} funciona sin necesidad de ningún ajuste preestablecido. El archivo robots.txt se respeta de forma predeterminada; respétalo en el caso de las fuentes que no sean de tu propiedad.
¿Cómo puedo importar datos a Snowflake, BigQuery o Postgres?
El rastreador devuelve líneas JSON en cada lote y flujos SSE en cada rastreo. Envíalos directamente al cargador de tu almacén de datos: jq -c '.results[]' | psql -c "COPY raw FROM stdin" para Postgres, bq insert para BigQuery, snowsql --query "PUT ..." + COPY INTO para Snowflake, o guárdalo en S3/GCS y deja que tu Snowpipe o tabla externa ya existente lo recoja. No hay que mantener ningún conector a medida: solo es JSON sobre HTTP.
¿Puedo ejecutarlo dentro de mi VPC?
Sí, Yozh es de autoalojamiento. docker compose up Incorpora dos contenedores (scraper + crawler) dentro de cualquier red que les proporciones: VPC, local, aislada físicamente. Sin comunicaciones con el servidor central, sin dependencia de SaaS. El tráfico saliente se dirige a los objetivos de los que extraes datos (y, opcionalmente, al CyberYozh App Proxy si lo habilitas). Los registros, trazas y métricas permanecen donde los coloques: el punto final de Prometheus en /metrics, registros JSON estructurados en stdout.
¿Cómo funcionan los reintentos, los errores y la observabilidad?
Cada solicitud dispone de un presupuesto de reintentos con retroceso exponencial (configurable por llamada). Los errores devuelven códigos de error estructurados — BLOCKED, CAPTCHA, SELECTOR_FAIL, UPSTREAM_TIMEOUT — de modo que tu cargador pueda tomar decisiones en función de ellos en lugar de analizar cadenas de texto. Cuando un selector deja de funcionar tras un rediseño de la fuente, la autorreparación de LLM lo regenera sobre la marcha (pasando llm: {model: "..."}) y etiqueta la respuesta con self_heal: true para su auditoría posterior. Las métricas de Prometheus sobre la profundidad de la cola, la tasa de éxito y la latencia del proxy se incluyen de serie.
¿Cómo se integra con Airflow, dbt y Temporal?
Yozh se encarga de la extracción de datos; tu orquestador se encarga de la programación. El patrón más sencillo: un Airflow BashOperator (o un PythonOperator con requests) llama a /scrape/batch, envía los resultados a una tabla provisional y, a continuación, encadena una tarea de dbt en la fase posterior. Los rastreos devuelven un flujo SSE: utiliza una tarea de larga duración o divídela en fragmentos reanudables mediante el job_id. Al no incluir un programador integrado, no hay dependencia: utiliza el que ya utilice tu plataforma de datos.
Código abierto · Licencia MIT · 84 ★

¿Estás listo para transferir datos web a tu almacén de datos?

Una configuración de Docker Compose, un flujo de líneas JSON, todas las fuentes normalizadas… directamente a Snowflake, BigQuery, Postgres y Kafka. Gratis. Para siempre. Márcanos con una estrella si te ha servido de ayuda: cada estrella cuenta.

Yozh Crawler + Scraper se distribuye bajo la licencia MIT. Úsalo. Haz un fork. Desarrolla con él.

Apreciado por los equipos de datos y los desarrolladores de IA

Lo que dicen quienes crean con Yozh

5,0 / 5 · Reseña de 5
GitHub
En una sola tarde cambiamos nuestro clúster interno de Playwright por Yozh. El punto final de MCP se integró directamente en nuestro agente Claude: sin necesidad de código de enlace, el rastreador y el extractor funcionaron a la primera.
Marcus Reinhardt Ingeniero jefe de datos Northwind Analytics
X
El sistema de preajustes es la característica estrella. Introducimos el nombre de una fuente y obtenemos un JSON limpio; la función de autocorrección incluso detectó dos cambios en el diseño de Amazon antes de que nos diéramos cuenta.
Priya Nair Fundador ScrapeStack
Reddit
Por fin, un rastreador de código abierto que trata los proxies y las sesiones como elementos de primer orden. Lo ejecutamos tras las barreras de inicio de sesión de los portales de nuestros socios: las sesiones se mantienen y los resultados son coherentes en todas las regiones.
Daniel Osei Ingeniero de backend Loopfeed
X
Lo he conectado a Cursor a través de MCP y ahora mi agente extrae datos web en tiempo real mientras realiza la tarea. El rastreo en tiempo real a través de SSE es justo lo que les faltaba a los flujos de trabajo de los agentes.
Elena Kovac Ingeniero de IA Vektor Labs
GitHub
Dejamos de utilizar una API de extracción de datos de pago para reducir costes y nos preparamos para un empeoramiento del servicio, pero ocurrió todo lo contrario. Es autohospedada, no hay facturación por solicitud y el esquema de salida es más claro que el que solíamos pagar.
Sofia Almeida Jefe de Ingeniería Tabbly