Repositorio: https://github.com/lightpanda-io/browser
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.