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 / Yozh Scraper
Software · Yozh Scraper

Introduces una URL y obtienes datos estructurados limpios

Yozh Scraper muestra cualquier URL en un navegador Playwright real y devuelve exactamente lo que pidas: campos extraídos, HTML sin procesar o una captura de pantalla de página completa. Incluye proxies CyberYozh integrados, modo sigiloso por defecto, configuraciones predefinidas para los principales sitios web y sesiones autenticadas. No es un servicio SaaS, se ejecuta en :8000.

$curl -X POST :8000/api/v1/scrape/page -d '{"url":"https://site.com", "proxy_type":"res_rotating","extract":{"type":"css","fields":{...}}}'

Scraping

Yozh Scraper procesa cualquier URL en un navegador real de Playwright y devuelve exactamente lo que pidas: campos extraídos, HTML sin procesar o una captura de pantalla de la página completa. Cada extracción es una tarea asíncrona: envía una URL, consulta el estado de la tarea y obtén el resultado. Los proxies, el modo sigiloso, los ajustes predefinidos y las sesiones autenticadas son todos de primera clase.

  • Representación real del navegador: Playwright representa páginas creadas con JavaScript; desactiva render desactivar para HTML estático.
  • Extracción estructurada: las reglas de campos CSS o XPath devuelven un data , mucho más económico que descargar y analizar el HTML sin procesar por tu cuenta.
  • Proxies integrados: CyberYozh residencial / LTE móvil / centro de datos, con segmentación geográfica y sin búsqueda de ID de grupo.
  • Modo sigiloso por defecto: parches «playwright-stealth» (navigator.webdriver, huella digital de WebGL/Canvas, tiempo de ejecución de Chrome) para reducir la detección de bots.
  • Configuraciones predefinidas: extrae datos de Amazon, Google, eBay, Walmart, YouTube y LinkedIn por nombre, con autocorrección opcional mediante LLM.
  • Sesiones: sesiones autenticadas gestionadas por el servidor para los objetivos que han iniciado sesión, que se reutilizan en los rastreos.
URL basehttp://localhost:8000
Documentación de OpenAPIhttp://localhost:8000/docs
Punto final de MCPhttp://localhost:8000/mcp
Se utiliza junto con Yozh Crawler. El rastreador (:8001) recorre un sitio web partiendo de una URL inicial y extrae todas las páginas mediante este rastreador; las mismas funciones de renderizado, proxy y sesión se aplican a las páginas rastreadas.

Inicio rápido

El scraper sale desde la raíz docker-compose.yml (junto al crawler):

bash
cp .env.example .env          # set CYBERYOZH_API_KEY if using proxies
docker compose up --build
# scraper → http://localhost:8000
# crawler → http://localhost:8001

Comprueba que esté activo:

bash
curl http://localhost:8000/api/v1/health
# {"status":"ok","workers":2}
Los proxies necesitan una clave API: configúrala CYBERYOZH_API_KEY en .env (puedes conseguir una en app.cyberyozh.com/api-access). Sin ella, solo proxy_type: none funciona.

Uso básico

Cada punto final de scraping crea una tarea en segundo plano y devuelve un job_id. Consulta el estado del trabajo y, a continuación, recupera sus resultados.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://example.com", "proxy_type": "none" }'
# → { "job_id": "req_abc123" }

curl http://localhost:8000/api/v1/scrape/req_abc123          # status
curl http://localhost:8000/api/v1/scrape/req_abc123/results  # results

El resultado final incluye metadatos y todo lo que hayas solicitado (data, raw_html, screenshot_base64):

JSON
{
  "job_id": "req_abc123",
  "status": "done",
  "total": 1, "done": 1,
  "results": [
    {
      "request_id": "req_abc123",
      "took_ms": 1234,
      "meta": { "url": "https://example.com", "final_url": "https://example.com/",
                "status_code": 200, "device": "desktop", "proxy_type": "none", "retries": 0 },
      "data": null, "raw_html": null, "screenshot_base64": null, "warnings": []
    }
  ]
}
status movimientos queuedrunningdone (o failed / cancelled). Los resultados están disponibles para done, failedy cancelled puestos de trabajo.

Extraer datos

Aplicar una extract regla y la respuesta incluirá un data objeto con claves que son los nombres de tus campos — mucho más sencillo que descargar raw_html y analizarlo tú mismo. Las reglas son css o xpath.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{
    "url": "https://example.com",
    "extract": {
      "type": "css",
      "fields": {
        "title": { "selector": "h1", "attr": "text", "required": true }
      }
    }
  }'
# result → { "data": { "title": "Example Domain" } }

Cada campo es una regla:

Clave de campoTipoPor defectoDescripción
selectorstringobligatorioSelector CSS o expresión XPath para el campo.
attrstringtextQué leer — text o un nombre de atributo (p. ej., href, src).
allboolfalseDevuelve todos los resultados como una lista, en lugar de solo el primero.
requiredboolfalseSe señala cuando falta: activa la autorreparación preconfigurada del LLM.

Utiliza "type": "xpath" con selectores XPath (p. ej., //h1) para la misma forma.

Capturas de pantalla y código HTML sin formato

Establecer screenshot: true para un PNG a página completa (base64 en screenshot_base64), o raw_html: true para obtener el código HTML completo tras el renderizado en raw_html.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://example.com", "screenshot": true, "raw_html": true }'
Las capturas de pantalla activan un desplazamiento para cargar las imágenes diferidas. Si además utilizas block_assets, desactívalo para las capturas de pantalla para que se muestren las imágenes.

Proxies

Para realizar un scraping fiable, los proxies son imprescindibles, ya que la mayoría de los sitios web modernos bloquean las solicitudes directas. Yozh se integra con el servicio de proxies CyberYozh; configura proxy_type en cualquier solicitud.

proxy_typeQué es
res_rotatingRotación residencial: opción predeterminada recomendada.
res_staticEstática residencial (IP dedicada).
mobileMóvil / LTE, dedicado.
mobile_sharedMóvil / LTE, fondo común.
dc_staticEstática del centro de datos.
noneConexión directa, sin proxy.

Selecciona una ubicación con proxy_geo (country_code / region / city). Descubre lo que has comprado sin tener que buscar los identificadores de los grupos:

cURL
curl "http://localhost:8000/api/v1/proxies/available?proxy_type=res_rotating"
curl "http://localhost:8000/api/v1/proxies/countries"
Los proxies requieren CYBERYOZH_API_KEY en el scraper .env. Consigue uno en app.cyberyozh.com/api-access, y, a continuación, reinicia el contenedor.

Presets

Un ajuste preestablecido combina un perfil de solicitud, una plantilla de URL y una receta de análisis, lo que te permite extraer datos de un sitio web por su nombre en lugar de tener que crear manualmente una solicitud. Se incluyen ajustes preestablecidos para Amazon, Google, eBay, Walmart, YouTube y LinkedIn; también puedes crear los tuyos propios (mediante CSS/XPath determinista o generados por IA).

cURL
curl -X POST http://localhost:8000/api/v1/scrape/preset/page 
  -H "Content-Type: application/json" 
  -d '{
    "source": "amazon_product",
    "preset_params": { "asin": "B08N5WRWNW" },
    "locale": "us",
    "llm": { "model": "openai/gpt-5.4-mini" }
  }'
# → { "job_id": "..." }  then GET /api/v1/scrape/<job_id>/results
llm es opcional. Sin él, el analizador determinista se ejecuta por sí solo; con él, los selectores se reparan automáticamente cuando un required campo devuelve un valor vacío. Las claves del proveedor (OPENAI_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY / OPENROUTER_API_KEY) se encuentran en el lado del servidor en .env.

Gestiona los ajustes predefinidos a través de GET /api/v1/presets, GET /api/v1/presets/{name}, y POST /api/v1/presets (los nombres de los ajustes predefinidos de usuario deben empezar por user_).

Sesiones

Sesiones autenticadas gestionadas por el servidor: se crea una, se inicia sesión una vez y, a continuación, se pasa su session_id a cualquier rastreo para que las páginas se recuperen con las cookies almacenadas y el estado de almacenamiento. Es necesario para objetivos que requieren inicio de sesión, como el linkedin_profile preajuste.

  1. POST /api/v1/sessions — create. Pines device / proxy_type / proxy_geo y un TTL. Devuelve { session_id, expires_at }.
  2. POST /api/v1/sessions/{id}/login — reproducir un script de inicio de sesión declarativo con creds en el cuerpo: { script, creds }.
  3. POST /api/v1/scrape/page con session_id set — scrape autenticado.
  4. DELETE /api/v1/sessions/{id} — limpiar.
cURL
# 1. create  →  {"session_id":"sess_...","expires_at":...}
curl -X POST http://localhost:8000/api/v1/sessions 
  -H "Content-Type: application/json" 
  -d '{ "device": "desktop", "proxy_type": "res_rotating" }'

# 2. log in (declarative DSL + creds)
curl -X POST http://localhost:8000/api/v1/sessions/sess_.../login 
  -H "Content-Type: application/json" 
  -d '{ "script": { "steps": [ {"op":"goto","url":"https://site/login"} ] },
        "creds": { "username": "...", "password": "..." } }'

# 3. scrape with the session
curl -X POST http://localhost:8000/api/v1/scrape/page 
  -H "Content-Type: application/json" 
  -d '{ "url": "https://site/secure", "session_id": "sess_...", "raw_html": true }'
session_id y cookies juntos → 422. El contenido extraído device / proxy_type / proxy_pool_id / proxy_geo deben coincidir con los valores fijos de la sesión. En el caso de CAPTCHA o 2FA, si el DSL de inicio de sesión no puede resolverlo, omite el script e inyecta cookies en la sesión en su lugar.

Extracción por lotes

Envía varias páginas en un solo trabajo con POST /api/v1/scrape/pages — cada entrada es una solicitud de rastreo completa. Consulta el estado y obtén los resultados a través de los mismos puntos de acceso del trabajo.

cURL
curl -X POST http://localhost:8000/api/v1/scrape/pages 
  -H "Content-Type: application/json" 
  -d '{
    "pages": [
      { "url": "https://example.com", "proxy_type": "none" },
      { "url": "https://example.org", "proxy_type": "none" }
    ]
  }'
Un «top-level» session_id se aplica a todas las páginas del lote (se rechaza con un 422 si una página ya tiene fijado otro).

MCP

El scraper aloja un punto final del Protocolo de Contexto de Modelo en /mcp (HTTP con capacidad de transmisión). Sitúa el cursor o el puntero sobre él y las herramientas aparecerán automáticamente:

  • run_scrape_page
  • run_scrape_pages
  • get_job_status
  • get_job_result
  • cancel_scrape_job
  • health
~/.claude/settings.json
"yozh-scraper": {
  "type": "http",
  "url": "http://localhost:8000/mcp"
}

Entonces solo tienes que pedir: «Extrae el contenido de https://example.com y dime qué hay en la página». El mismo punto final funciona tanto desde un agente de LangChain como desde un nodo de la herramienta cliente MCP de n8n.

Referencia de configuración

Solicitud — ScrapeRequest (seleccionado)

CampoTipoPor defectoDescripción
urlcadena (URL)obligatorioLa página que hay que mostrar y de la que hay que extraer datos.
renderbooltrueGenerar con el navegador (necesario para páginas creadas con JavaScript).
wait_untildomcontentloaded · networkidledomcontentloadedCuando la página se considera lista.
wait_for_selectorcadena · nulonullEspera a que aparezca un elemento concreto antes de capturar la imagen.
devicedesktop · mobiledesktopVentana de visualización / Perfil de agente de usuario.
proxy_typeVéase «Proxies»noneConjunto de servidores proxy por los que pasan las rutas de recuperación.
proxy_geoProxyGeo · nulonullSegmentación por país, región o ciudad.
session_idcadena · nulonullUtiliza una sesión autenticada; consulta la sección «Sesiones».
stealthbooltrueAplica medidas de refuerzo contra la detección.
block_assetsbool · nullenvBloquear imágenes, fuentes y archivos multimedia para mejorar la velocidad (se recurre a BLOCK_ASSETS).
extractExtractRule · nulonullReglas de campo CSS/XPath → estructuradas data.
raw_htmlboolfalseIncluye el código HTML completo tras el renderizado.
screenshotboolfalseCaptura un archivo PNG a página completa (base64).

Referencia de la API

MétodoRutaPropósito
POST/api/v1/scrape/pageExtrae una página. Devuelve {"job_id":"…"}.
POST/api/v1/scrape/pagesExtrae varias páginas de forma masiva en un solo proceso.
POST/api/v1/scrape/preset/pageExtraer datos por nombre de configuración preestablecida (Amazon, Google, …).
GET/api/v1/scrape/{id}Estado del trabajo (en cola/en ejecución/finalizado/…).
GET/api/v1/scrape/{id}/resultsResultados del trabajo (páginas + ScrapeResponse).
DELETE/api/v1/scrape/{id}Cancelación suave: finalización de las páginas durante el vuelo.
POST/api/v1/sessionsCrea una sesión autenticada.
POST/api/v1/sessions/{id}/loginEjecuta un script de inicio de sesión declarativo.
DELETE/api/v1/sessions/{id}Eliminar una sesión.
GET/api/v1/proxies/availableMostrar los proxies comprados de un tipo determinado.
GET/api/v1/presetsLista de preajustes integrados y de usuario.
GET/api/v1/healthSalud + número de trabajadores.

Detalles importantes

Los proxies necesitan una clave API. Configura CYBERYOZH_API_KEY en el scraper .env. Sin ella, solo proxy_type: none funcionará la conexión (directa).
Tareas asíncronas en memoria. Cada extracción se ejecuta en segundo plano; el almacén se encuentra en memoria y se restablece al reiniciar el contenedor. Recupera los resultados mientras estén disponibles o guárdalos tú mismo.
Las sesiones son exclusivas con cookies. Al pasar ambas session_id y cookies devuelve un 422, y el scraping debe coincidir con los valores fijados de la sesión device / proxy_type / proxy_geo.
La autorreparación de LLM se realiza en el lado del servidor. La autorreparación preconfigurada utiliza claves del proveedor (OPENAI / ANTHROPIC / GEMINI / OPENROUTER) procedentes de .env — que el cliente nunca envía.

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
Código abierto · Licencia MIT · 84 ★

Procesar una URL. Obtener datos limpios como resultado

Yozh Scraper es el motor de renderizado que hay detrás de toda la pila: uno docker compose up y ya tienes proxies, modo sigiloso, configuraciones predefinidas, sesiones y extracción, compatible con MCP, en tu propia infraestructura. Gratis. Para siempre.

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