★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.
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.
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 medianteLLM 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.
1Pon 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
2Extraer 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.
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.
1Resumen 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.shcurl -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 DAGdbt build --select staging.raw_scrape+
200 URLs/loteCOPY FROM stdintu cron / Airflow
2Rastreo 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.
Streaming SSEdeduplicación por trabajo (SHA1)inserciones solo de deltas
3Flujo 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.
cadena de scraping + publicaciónProductor Kafkaun 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.
MRMarcus ReinhardtIngeniero jefe de datosNorthwind 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.
PNPriya NairFundadorScrapeStack
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.
DODaniel OseiIngeniero de backendLoopfeed
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.
EKElena KovacIngeniero de IAVektor 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.