Volver al blog

API de Desbloqueo Web: Renderiza Cualquier Página a HTML, Markdown o PNG

Emily Chen
Emily Chen

Advanced Data Extraction Specialist

08-Jul-2026

TL;DR:

  • El Web Unlocker convierte cualquier URL en datos limpios con una sola POST. Envía una URL a unlocker.webunlocker; recibe la página como HTML, texto plano, Markdown, una captura de pantalla, o contenido extraído — sin navegador que gestionar.
  • La renderización de JavaScript es una opción, no un producto separado. Establece jsRender.enabled: true y la página se renderiza en un navegador real antes de construir la respuesta, por lo que el contenido del lado del cliente ya está disponible.
  • Tú eliges la forma de la respuesta. response.type puede ser html, plaintext, markdown, png, jpeg, network, o content — solicita Markdown para LLMs, PNG para una captura de pantalla, content para extracción estructurada.
  • El país del proxy es un campo. Establece proxy.country para enrutar la solicitud a través de un egreso residencial en esa región; una región desajustada es una razón común por la que una página se renderiza de manera diferente.
  • Dos tiempos de espera gobiernan cada llamada. Un límite de carga de página de 30 segundos y un límite de ejecución global de 180 segundos — el límite de carga de página tiene prioridad.
  • Gratis para empezar. Las nuevas cuentas de Scrapeless incluyen uso gratuito de la API Universal Scraping — regístrate en app.scrapeless.com.

Introducción: un endpoint, cualquier página, la forma que pediste

La mayoría del código de raspado dedica su esfuerzo a todo lo alrededor de los datos: lanzar un navegador, esperar JavaScript, manejar el bloqueo, y luego analizar HTML en algo utilizable. La API Universal Scraping de Scrapeless colapsa eso en una única solicitud HTTP. Haces un POST de una URL al actor Web Unlocker, y la respuesta es la página — ya renderizada, ya en el formato que pediste.

Esta guía abarca el actor unlocker.webunlocker de principio a fin: la forma de la solicitud, un primer curl, el sobre de la respuesta, una integración en Python, los siete tipos de respuesta que puede devolver la renderización de JavaScript, y cómo mantener las solicitudes limpias. Cada solicitud y respuesta a continuación se capturó contra la API en vivo.


Lo que puedes hacer con ello

  • Obtener una página como HTML sin procesar — un GET normal a través de un egreso limpio, para cuando parsearás el marcado tú mismo.
  • Renderizar páginas con mucho JavaScript — establece jsRender.enabled y lee el contenido que solo existe después de que el cliente se ejecuta.
  • Obtener Markdown para un LLM — solicita type: markdown y alimenta el resultado directamente en un pipeline RAG o un prompt.
  • Capturar una captura de pantalla — solicita type: png o jpeg y recibe el área de visualización renderizada como una imagen.
  • Extraer contenido estructurado — solicita type: content para obtener encabezados, enlaces, tablas, correos electrónicos, imágenes y metadatos de la página.
  • Observar respuestas de red — solicita type: network para capturar las respuestas XHR/fetch que realiza una página, filtradas por URL, estado y método.
  • Interactuar con la página primero — ejecuta instructions (esperar un selector, hacer clic, rellenar, presionar teclas) antes de que se construya la respuesta.

Por qué la API Universal Scraping de Scrapeless

La API Universal Scraping es la superficie de desbloqueo web gestionada: envías una URL, maneja la renderización, el egreso y la detección anti-bloqueo, y devuelve datos limpios. Para este flujo de trabajo en particular, ofrece:

  • Renderización de JavaScript del lado de la nube — un navegador real ejecuta la página, por lo que las aplicaciones de una sola página y el contenido cargado de forma diferida se resuelven antes de construir la respuesta.
  • Proxies residenciales en más de 195 países — enruta a través de proxy.country para que la reputación del IP de salida sea limpia y las páginas geo-enrutadas se sirvan correctamente.
  • Manejo automático de desafíos — reCAPTCHA v2, Cloudflare Turnstile, y el intersticial de Cloudflare se manejan dentro del actor.
  • Siete formatos de respuesta — HTML, texto plano, Markdown, PNG, JPEG, captura de red y contenido estructurado desde el mismo endpoint.
  • Un solo contrato HTTP — sin ciclo de vida de navegador, sin versiones de controladores; la respuesta es los datos.

Obtén tu clave de API en el plan gratuito en app.scrapeless.com.


Requisitos previos

  • Una cuenta de Scrapeless y clave de API — regístrate en app.scrapeless.com
  • curl para la primera solicitud, y Python 3.10+ (o Node.js 18+) para la integración
  • Familiaridad básica con HTTP y JSON

Cómo funciona el Web Unlocker

Cada llamada es un POST a un endpoint con un cuerpo JSON de {actor, input, proxy}.

Parámetros de solicitud

Campo Donde Significado
actor nivel superior unlocker.webunlocker
input.url entrada la página a obtener
input.method entrada método HTTP (por defecto GET)
input.redirect entrada seguir redireccionamientos (true/false)
input.jsRender entrada { enabled, response, instructions, block } — opciones de renderización
proxy.country proxy código de país ISO o ANY

La autenticación es el encabezado x-api-token. El sobre de la respuesta es siempre { "code": 200, "data": ... }.

Captura rápida con curl

Obtén una página como HTML a través de un egreso residencial:

bash Copy
curl -X POST https://api.scrapeless.com/api/v2/unlocker/request \
  -H "x-api-token: ${SCRAPELESS_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
```json
"actor": "unlocker.webunlocker",
    "input": { "url": "https://www.example.com", "method": "GET", "redirect": false },
    "proxy": { "country": "ANY" }
  }'

Sobre el sobre de respuesta

json Copy
// muestra ilustrativa — la forma del sobre es exacta; el GET activo anterior devolvió el código 200 con 559 bytes de HTML de example.com
{
  "code": 200,
  "data": "<!doctype html><html>…</html>"
}

Un código de 200 significa que la solicitud tuvo éxito; data lleva la carga — texto HTML aquí, Markdown o una imagen base64 para otros tipos de respuesta.


Integrando la API en Python

La misma llamada desde Python, leyendo la clave desde el entorno:

python Copy
import os
import requests

API_KEY = os.environ["SCRAPELESS_API_KEY"]

resp = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    headers={"x-api-token": API_KEY, "Content-Type": "application/json"},
    json={
        "actor": "unlocker.webunlocker",
        "input": {"url": "https://www.example.com", "method": "GET", "redirect": False},
        "proxy": {"country": "ANY"},
    },
    timeout=70,
)

data = resp.json()
if data.get("code") == 200:
    html = data["data"]
    print(len(html), "bytes de HTML")

Obtén tu clave API en el plan gratuito: app.scrapeless.com


Renderizando JavaScript: los siete tipos de respuesta

Para renderizar la página en un navegador real primero, añade jsRender. El response.type decide qué regresa. Solicita Markdown para una página — ideal para alimentar un LLM:

python Copy
payload = {
    "actor": "unlocker.webunlocker",
    "proxy": {"country": "ANY"},
    "input": {
        "url": "https://www.example.com",
        "jsRender": {
            "enabled": True,
            "response": {"type": "markdown"},
        },
    },
}
resp = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    json=payload,
    headers={"x-api-token": API_KEY, "Content-Type": "application/json"},
    timeout=70,
)
print(resp.json()["data"])
# "# Dominio de Ejemplo\n\nEste dominio es para uso en ejemplos de documentación..."

El campo type selecciona el formato:

response.type Devuelve
html HTML renderizado después de que se ejecuta JavaScript
plaintext texto visible, marcado eliminado
markdown la página como Markdown (listo para LLM)
png / jpeg una captura de pantalla como cadena base64
network respuestas XHR/fetch capturadas, filtradas por urls, status, methods
content extracción estructurada — encabezados, enlaces, tablas, imágenes, correos electrónicos, metadatos

Para una captura de pantalla, solicita png y decodifica los data base64 a bytes:

python Copy
import base64

payload["input"]["jsRender"]["response"] = {"type": "png"}
resp = requests.post(
    "https://api.scrapeless.com/api/v2/unlocker/request",
    json=payload,
    headers={"x-api-token": API_KEY, "Content-Type": "application/json"},
    timeout=70,
)
with open("page.png", "wb") as f:
    f.write(base64.b64decode(resp.json()["data"]))

Controlando la página antes de la captura

Cuando el contenido aparece solo después de la interacción, pasa instructions — cada una es un verbo que el renderizador ejecuta en orden antes de construir la respuesta:

json Copy
{
  "actor": "unlocker.webunlocker",
  "input": {
    "url": "https://example.com",
    "jsRender": {
      "enabled": true,
      "instructions": [
        { "waitFor": [".dynamic-content", 30000] },
        { "click": ["#load-more", 1000] },
        { "fill": ["#search-input", "término de búsqueda"] },
        { "keyboard": ["presionar", "Enter"] },
        { "evaluate": "window.scrollTo(0, document.body.scrollHeight)" }
      ]
    }
  }
}

También puedes reducir el ancho de banda bloqueando tipos de recursos que no necesitas con jsRender.block.resources (por ejemplo, Image, Font, Media, Stylesheet), que la capa de búsqueda omite según las categorías de recursos definidas en la API Fetch.


Cómo evitar problemas comunes

  • Un campo que no está en la página es nulo, no un error. Trata cada campo extraído como opcional y protege su ausencia en lugar de asumir que está presente.
  • Cuidado con los dos tiempos de espera. Un límite de carga de página de 30 segundos y un límite global de ejecución de 180 segundos limitan cada llamada, y el límite de carga de página tiene prioridad: mantén los valores de waitFor dentro de ese presupuesto. La especificación de semántica HTTP define los códigos de estado que verás si un objetivo tiene un error.
  • Fija el país al contenido. Si una página dirige geográficamente, ajusta proxy.country a la región que sirve la versión que deseas; ANY está bien cuando no lo hace.
  • Elija el tipo de respuesta deliberadamente. Solicite markdown o content cuando desee datos, no html que deberá analizar: la extracción ocurre del lado del servidor de todos modos, y los patrones de tráfico automatizado que maneja el desbloqueador están catalogados en el proyecto de Amenazas Automatizadas de OWASP.

Conclusión: la página, en la forma que necesita

El Desbloqueador Web reduce un raspado a una decisión: qué URL y qué tipo de respuesta. La renderización, el egreso y la detección-anti se manejan dentro del actor, por lo que una página rica en JavaScript se convierte en Markdown limpio o una captura de pantalla en una sola solicitud. Combínelo con el Navegador de Raspado cuando necesite una sesión interactiva completa, y lea sobre egreso residencial versus de centro de datos ya que la reputación del proxy decide la mayoría de los resultados de renderización. La documentación de la API Universal de Raspado cubre cada campo.


¿Listo para construir su canal de datos impulsado por IA?

Únase a nuestra comunidad para reclamar un plan gratuito y conectarse con desarrolladores que construyen canalizaciones de extracción: Discord · Telegram.

Regístrese en app.scrapeless.com para uso gratuito de la API Universal de Raspado, y consulte precios para escalar.


FAQ

Q: ¿Cuál es la diferencia entre el Desbloqueador Web y el Navegador de Raspado?
El Desbloqueador Web es un punto final de solicitud/respuesta único: envíe una URL, obtenga la página de regreso en una sola llamada. El Navegador de Raspado es un navegador en la nube interactivo completo que usted controla con Puppeteer o Playwright. Use el desbloqueador para obtener y analizar; use el navegador para sesiones de múltiples pasos.

Q: ¿Necesito habilitar la renderización de JavaScript?
Solo cuando el contenido que necesita esté renderizado en el cliente. Un simple GET devuelve el HTML del servidor; agregar jsRender.enabled: true ejecuta la página en un navegador real primero, que es lo que desea para aplicaciones de una sola página y contenido cargado de forma perezosa.

Q: ¿Qué tipo de respuesta debo usar para una canalización LLM?
markdown — devuelve la página como Markdown limpio con la marca eliminada, que es lo que la mayoría de las canalizaciones RAG y de indicaciones desean. Use content cuando necesite campos discretos (títulos, enlaces, tablas) en lugar de prosa.

Q: ¿Cómo obtengo una captura de pantalla?
Establezca response.type en png o jpeg; el campo data se devuelve como una cadena base64 que debe decodificar en bytes de imagen.

Q: ¿Necesito un proxy?
El egreso está incorporado. Establezca proxy.country para enrutar a través de IP residenciales en una región específica, o ANY para dejar que el servicio elija. Fijar un país es importante cuando una página geo-ruta o desafía IP de centro de datos.

Q: ¿Cuáles son los tiempos de espera?
Un límite fijo de carga de página de 30 segundos y un límite de ejecución global de 180 segundos. El límite de carga de página tiene prioridad y puede finalizar la llamada antes del límite global, así que mantenga cualquier valor de waitFor dentro de ese presupuesto.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar