Lightpanda: El navegador para scrapers con IA 11 veces más rápido que Chrome

March 15, 2026

Dificultad media, aproximadamente 20 minutos. Aprende a usar este navegador headless ligero para la recolección de datos con IA; es 11 veces más rápido que Chrome y consume 9 veces menos memoria.

Público objetivo

  • Ingenieros que requieren web scraping a gran escala
  • Desarrolladores de recolección de datos para IA/LLM
  • Ingenieros de pruebas automatizadas
  • Entusiastas de la tecnología interesados en navegadores de alto rendimiento

Dependencias y entorno principales

  • Linux x86_64 o macOS aarch64
  • Windows requiere WSL2
  • Docker (opcional, recomendado para entornos de producción)
  • Node.js 18+ (para ejecutar scripts de Puppeteer/Playwright)

TIP

Si usas Windows, instala Lightpanda directamente en WSL2 y ejecuta Puppeteer desde el host de Windows.

Estructura completa del proyecto

lightpanda-browser/
├── lightpanda              # Binario del programa principal
├── LICENSE                # Licencia MIT
├── README.md              # Descripción del proyecto
├── CONTRIBUTING.md        # Guía de contribución
├── CLA.md                 # Acuerdo de licencia para colaboradores
├── docker/
│   └── Dockerfile         # Archivo de construcción de Docker
├── src/                   # Código fuente en Zig (si deseas compilar desde el origen)
└── docs/                  # Directorio de documentación

Tutorial paso a paso

Paso 1: Descargar e instalar Lightpanda

Podemos descargar los binarios directamente desde las compilaciones nocturnas (nightly builds).

Instalación en Linux:

curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && \
chmod a+x ./lightpanda

Instalación en macOS:

curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-aarch64-macos && \
chmod a+x ./lightpanda

Verificar la instalación:

./lightpanda --version

WARNING

Actualmente, solo existen binarios oficiales para Linux x86_64 y macOS aarch64. Los usuarios de Windows deben usar WSL2.

Paso 2: Iniciar con Docker (Recomendado)

Si no deseas descargar el binario directamente, puedes usar Docker para empezar más rápido:

docker run -d --name lightpanda -p 9222:9222 lightpanda/browser:nightly

Esto iniciará directamente el servidor CDP, escuchando en el puerto 9222.

Verificar que el contenedor esté en ejecución:

docker ps | grep lightpanda

Paso 3: Iniciar el servidor CDP

Si no usamos Docker, necesitamos iniciar el servidor CDP manualmente:

./lightpanda serve --obey_robots --log_format pretty --log_level info --host 127.0.0.1 --port 9222

La salida será similar a:

INFO  telemetry : telemetry status . . . . . . . . . . . . .  [+0ms]
      disabled = false

INFO  app : server running . . . . . . . . . . . . . . . .  [+0ms]
      address = 127.0.0.1:9222

TIP

El parámetro --obey_robots hará que Lightpanda respete el archivo robots.txt, lo cual es una norma básica de cortesía en el scraping.

Paso 4: Escribir un script de Puppeteer

Ahora escribiremos nuestro primer script de scraping. Supongamos que ya has instalado puppeteer-core en el directorio del proyecto:

npm install puppeteer-core

Crea un archivo crawler.js:

'use strict'

import puppeteer from 'puppeteer-core';

// Conectar al servidor CDP de Lightpanda vía WebSocket
const browser = await puppeteer.connect({
  browserWSEndpoint: "ws://127.0.0.1:9222",
});

// Crear contexto de navegador y página
const context = await browser.createBrowserContext();
const page = await context.newPage();

// Visitar la página de destino
await page.goto('https://demo-browser.lightpanda.io/amiibo/', {waitUntil: "networkidle0"});

// Extraer todos los enlaces de la página
const links = await page.evaluate(() => {
  return Array.from(document.querySelectorAll('a')).map(row => {
    return row.getAttribute('href');
  });
});

console.log('Enlaces capturados:');
links.forEach(link => console.log(link));

// Estadísticas de carga de página
const metrics = await page.metrics();
console.log('\nMétricas de la página:');
console.log('Tiempo de ejecución del script:', metrics.ScriptDuration, 'ms');
console.log('Número de nodos DOM:', metrics.Nodes);

// Limpiar recursos
await page.close();
await context.close();
await browser.disconnect();

Ejecutar el script:

node crawler.js

TIP

Si iniciaste Lightpanda con Docker, cambia el browserWSEndpoint en el script a ws://localhost:9222.

Paso 5: Experimentar el scraping ultra rápido

Los datos oficiales de Lightpanda muestran:

  • Velocidad: 11 veces más rápido que Chrome
  • Memoria: consume 9 veces menos que Chrome
  • Arranque: instantáneo (el arranque de Chrome headless tarda varios segundos)

Hagamos una prueba comparativa simple. Primero asegúrate de que Lightpanda se esté ejecutando:

./lightpanda serve --host 127.0.0.1 --port 9222

Luego escribe un script de scraping por lotes:

'use strict'

import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
  browserWSEndpoint: "ws://127.0.0.1:9222",
});

const context = await browser.createBrowserContext();
const page = await context.newPage();

// Scraping de múltiples páginas por lotes
const urls = [
  'https://demo-browser.lightpanda.io/amiibo/',
  'https://demo-browser.lightpanda.io/campfire-commerce/',
  'https://demo-browser.lightpanda.io/hacker-news-top-stories/',
];

const startTime = Date.now();

for (const url of urls) {
  console.log(`\nScrapeando: ${url}`);
  const pageStart = Date.now();

  await page.goto(url, {waitUntil: "networkidle0"});

  const title = await page.title();
  console.log(`Título: ${title}`);
  console.log(`Tiempo: ${Date.now() - pageStart}ms`);
}

console.log(`\nTiempo total: ${Date.now() - startTime}ms`);

await browser.disconnect();

Ejecución:

node batch-crawler.js

Notarás que incluso en el procesamiento por lotes, la respuesta de Lightpanda es sumamente rápida.

Paso 6: Funciones avanzadas - Captura de pantalla

Lightpanda también soporta la función de captura de pantalla:

'use strict'

import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
  browserWSEndpoint: "ws://127.0.0.1:9222",
});

const context = await browser.createBrowserContext();
const page = await context.newPage();

// Configurar el tamaño del viewport
await page.setViewport({ width: 1280, height: 720 });

await page.goto('https://demo-browser.lightpanda.io/campfire-commerce/', {waitUntil: "networkidle0"});

// Guardar captura de pantalla
await page.screenshot({ path: 'screenshot.png', fullPage: true });

console.log('Captura de pantalla guardada en screenshot.png');

await browser.disconnect();

Solución de problemas comunes

Q1: El puerto 9222 ya está en uso

Síntoma: Error al iniciar "Address already in use"

Solución:

# Ver quién está usando el puerto
lsof -i :9222

# O cambiar el puerto
./lightpanda serve --port 9223
# Y cambiar en el script a ws://127.0.0.1:9223

Q2: Error de Web API no soportada

Síntoma: Al ejecutar el script aparece "XXX is not defined"

Solución: Lightpanda está actualmente en fase Beta y la cobertura de Web API no es completa. Reporta el problema en GitHub; normalmente el equipo responde con rapidez.

Q3: Error al iniciar el contenedor Docker

Síntoma: El comando docker run falla o el contenedor se cierra inmediatamente

Solución:

# Ver los logs del contenedor
docker logs lightpanda

# Si hay conflicto de puertos, cámbialo
docker run -d --name lightpanda -p 9322:9222 lightpanda/browser:nightly

Q4: Puppeteer no se conecta

Síntoma: Error: Protocol error (Target.attachToTarget): No target with given id

Solución: Confirma que el servidor CDP de Lightpanda está iniciado y que la versión es compatible con Puppeteer. Intenta reiniciar:

# Matar el proceso antiguo
pkill lightpanda
# Reiniciar
./lightpanda serve --port 9222

Q5: Tiempo de carga de página agotado (Timeout)

Síntoma: TimeoutError: Navigation timeout

Solución:

# Aumentar el tiempo de espera
await page.goto(url, { timeout: 60000 });
# O usar domcontentloaded en lugar de networkidle0
await page.goto(url, { waitUntil: "domcontentloaded" });

Q6: Quiero usar Playwright en lugar de Puppeteer

Síntoma: No sabes cómo integrarlo

Solución: La forma de conexión de Playwright es similar a la de Puppeteer:

import { chromium } from 'playwright';

const browser = await chromium.connectOverCDP('ws://127.0.0.1:9222');
// El uso posterior es igual

Lectura extendida / Direcciones avanzadas

1. Compilar desde el código fuente

Si deseas profundizar en la implementación interna de Lightpanda o contribuir con código, puedes compilarlo tú mismo:

# Instalar Zig 0.15.2
curl -L https://ziglang.org/download/0.15.2/zig-linux-x86_64-0.15.2.tar.xz | tar xJ

# Clonar el proyecto
git clone https://github.com/lightpanda-io/browser.git
cd browser

# Compilar
zig build run

2. Integración con Playwright

Lightpanda soporta oficialmente Playwright. Uso:

npm install playwright
import { firefox } from 'playwright';

const browser = await firefox.connectOverCDP('ws://127.0.0.1:9222');
// El uso posterior es igual al de Playwright estándar

WARNING

El soporte para Playwright es limitado: dado que Lightpanda añade nuevas Web APIs constantemente, Playwright podría elegir rutas de ejecución distintas que causen que ciertos scripts no funcionen.

3. Proxy e interceptación de red

Lightpanda soporta proxies e interceptación de peticiones de red:

# Especificar proxy al iniciar
./lightpanda serve --proxy http://proxy:8080

4. Cabeceras HTTP personalizadas

await page.setExtraHTTPHeaders({
  'X-Custom-Header': 'valor'
});

5. Web Platform Tests

El equipo de Lightpanda avanza continuamente en las pruebas de compatibilidad de Web API. Puedes probar el soporte de APIs específicas en wpt.live.

Updated March 15, 2026