Репозиторий: https://github.com/lightpanda-io/browser
Сложность: средняя. Время: около 20 минут. Узнайте, как использовать легковесный headless-браузер для сбора данных под ИИ, который работает в 11 раз быстрее Chrome и потребляет в 9 раз меньше памяти.
Целевая аудитория
- Инженеры, работающие с крупномасштабным веб-парсингом
- Разработчики инструментов сбора данных для AI/LLM
- Инженеры по автоматизации тестирования
- Технические энтузиасты, интересующиеся высокопроизводительными браузерными технологиями
Основные зависимости и среда
- Linux x86_64 или macOS aarch64
- Windows требует наличия WSL2
- Docker (опционально, рекомендуется для продакшена)
- Node.js 18+ (для запуска скриптов Puppeteer/Playwright)
TIP
Если вы используете Windows, установите Lightpanda напрямую в WSL2, а Puppeteer запускайте на хостовой системе Windows.
Полная структура проекта
lightpanda-browser/
├── lightpanda # Исполняемый файл основной программы
├── LICENSE # Лицензия MIT
├── README.md # Описание проекта
├── CONTRIBUTING.md # Руководство по контрибьютингу
├── CLA.md # Лицензионное соглашение участника
├── docker/
│ └── Dockerfile # Файл сборки Docker
├── src/ # Исходный код на Zig (если вы хотите собрать из исходников)
└── docs/ # Директория с документацией
Пошаговое руководство
Шаг 1: Загрузка и установка Lightpanda
Мы можем скачать бинарные файлы напрямую из nightly builds.
Установка на Linux:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-x86_64-linux && \
chmod a+x ./lightpanda
Установка на macOS:
curl -L -o lightpanda https://github.com/lightpanda-io/browser/releases/download/nightly/lightpanda-aarch64-macos && \
chmod a+x ./lightpanda
Проверка установки:
./lightpanda --version
WARNING
На данный момент официальные бинарные файлы доступны только для Linux x86_64 и macOS aarch64. Пользователям Windows необходимо использовать WSL2.
Шаг 2: Запуск через Docker (рекомендуется)
Если вы не хотите скачивать бинарный файл, Docker — самый быстрый способ начать работу:
docker run -d --name lightpanda -p 9222:9222 lightpanda/browser:nightly
Это запустит сервер CDP, слушающий порт 9222.
Проверка работы контейнера:
docker ps | grep lightpanda
Шаг 3: Запуск CDP-сервера вручную
Если мы не используем Docker, нужно запустить CDP-сервер вручную:
./lightpanda serve --obey_robots --log_format pretty --log_level info --host 127.0.0.1 --port 9222
Вывод будет примерно таким:
INFO telemetry : telemetry status . . . . . . . . . . . . . [+0ms]
disabled = false
INFO app : server running . . . . . . . . . . . . . . . . [+0ms]
address = 127.0.0.1:9222
TIP
Параметр --obey_robots заставляет Lightpanda соблюдать robots.txt, что является базовым правилом вежливости при парсинге.
Шаг 4: Написание скрипта Puppeteer
Напишем наш первый скрипт для парсинга. Предположим, вы уже установили puppeteer-core в директории проекта:
npm install puppeteer-core
Создайте файл crawler.js:
'use strict'
import puppeteer from 'puppeteer-core';
// Подключение к CDP-серверу Lightpanda через WebSocket
const browser = await puppeteer.connect({
browserWSEndpoint: "ws://127.0.0.1:9222",
});
// Создание контекста браузера и страницы
const context = await browser.createBrowserContext();
const page = await context.newPage();
// Переход на целевую страницу
await page.goto('https://demo-browser.lightpanda.io/amiibo/', {waitUntil: "networkidle0"});
// Извлечение всех ссылок со страницы
const links = await page.evaluate(() => {
return Array.from(document.querySelectorAll('a')).map(row => {
return row.getAttribute('href');
});
});
console.log('Собрано ссылок:');
links.forEach(link => console.log(link));
// Сбор метрик времени загрузки страницы
const metrics = await page.metrics();
console.log('\nПоказатели страницы:');
console.log('Время выполнения скрипта:', metrics.ScriptDuration, 'ms');
console.log('Количество узлов DOM:', metrics.Nodes);
// Очистка ресурсов
await page.close();
await context.close();
await browser.disconnect();
Запуск скрипта:
node crawler.js
TIP
Если вы запустили Lightpanda через Docker, измените browserWSEndpoint на ws://localhost:9222.
Шаг 5: Ощутите скорость
Официальные данные Lightpanda показывают:
- Скорость: в 11 раз быстрее Chrome
- Память: в 9 раз меньше Chrome
- Запуск: мгновенный (запуск безголового Chrome занимает несколько секунд)
Проведем тест производительности. Убедитесь, что Lightpanda запущен:
./lightpanda serve --host 127.0.0.1 --port 9222
Затем напишите скрипт для массового парсинга:
'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();
// Пакетный сбор данных с нескольких страниц
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(`\nПарсинг: ${url}`);
const pageStart = Date.now();
await page.goto(url, {waitUntil: "networkidle0"});
const title = await page.title();
console.log(`Заголовок: ${title}`);
console.log(`Затрачено времени: ${Date.now() - pageStart}ms`);
}
console.log(`\nОбщее время: ${Date.now() - startTime}ms`);
await browser.disconnect();
Запуск:
node batch-crawler.js
Вы заметите, что даже при пакетной загрузке отклик Lightpanda остается очень быстрым.
Шаг 6: Продвинутые возможности — скриншоты
Lightpanda также поддерживает создание скриншотов:
'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();
// Установка размера вьюпорта
await page.setViewport({ width: 1280, height: 720 });
await page.goto('https://demo-browser.lightpanda.io/campfire-commerce/', {waitUntil: "networkidle0"});
// Сохранение скриншота
await page.screenshot({ path: 'screenshot.png', fullPage: true });
console.log('Скриншот сохранен в screenshot.png');
await browser.disconnect();
Устранение типичных проблем
Q1: Порт 9222 уже занят
Симптом: ошибка "Address already in use" при запуске.
Решение:
# Проверить, кто использует порт
lsof -i :9222
# Или сменить порт
./lightpanda serve --port 9223
# И обновить адрес в скрипте: ws://127.0.0.1:9223
Q2: Ошибка поддержки Web API
Симптом: ошибка "XXX is not defined" при выполнении скрипта.
Решение: Lightpanda сейчас находится в стадии Beta, покрытие Web API не полное. Создайте issue на GitHub, команда обычно отвечает быстро.
Q3: Ошибка запуска Docker-контейнера
Симптом: ошибка при docker run или мгновенное завершение работы контейнера.
Решение:
# Проверить логи контейнера
docker logs lightpanda
# Если конфликт портов, измените их
docker run -d --name lightpanda -p 9322:9222 lightpanda/browser:nightly
Q4: Puppeteer не подключается
Симптом: Error: Protocol error (Target.attachToTarget): No target with given id.
Решение: Убедитесь, что CDP-сервер Lightpanda запущен и его версия совместима с Puppeteer. Попробуйте перезапустить:
# Убить старый процесс
pkill lightpanda
# Запустить снова
./lightpanda serve --port 9222
Q5: Таймаут загрузки страницы
Симптом: TimeoutError: Navigation timeout.
Решение:
# Увеличить время ожидания
await page.goto(url, { timeout: 60000 });
# Или заменить networkidle0 на domcontentloaded
await page.goto(url, { waitUntil: "domcontentloaded" });
Q6: Использование Playwright вместо Puppeteer
Симптом: Непонятно, как интегрировать.
Решение: Способ подключения Playwright аналогичен Puppeteer:
import { chromium } from 'playwright';
const browser = await chromium.connectOverCDP('ws://127.0.0.1:9222');
// Далее использование идентично
Дополнительное чтение / Продвинутые темы
1. Сборка из исходников
Если вы хотите изучить внутреннее устройство Lightpanda или внести свой вклад, вы можете собрать проект сами:
# Установите Zig 0.15.2
curl -L https://ziglang.org/download/0.15.2/zig-linux-x86_64-0.15.2.tar.xz | tar xJ
# Клонируйте проект
git clone https://github.com/lightpanda-io/browser.git
cd browser
# Скомпилируйте
zig build run
2. Интеграция с Playwright
Lightpanda официально поддерживает Playwright. Установка:
npm install playwright
import { firefox } from 'playwright';
const browser = await firefox.connectOverCDP('ws://127.0.0.1:9222');
// Использование как в обычном Playwright
WARNING
Поддержка Playwright имеет ограничения: так как Lightpanda постоянно добавляет новые Web API, Playwright может выбирать другие пути выполнения, что приведет к неработоспособности некоторых скриптов.
3. Прокси и перехват сети
Lightpanda поддерживает прокси и перехват сетевых запросов:
# Указание прокси при запуске
./lightpanda serve --proxy http://proxy:8080
4. Пользовательские HTTP-заголовки
await page.setExtraHTTPHeaders({
'X-Custom-Header': 'value'
});
5. Web Platform Tests
Команда Lightpanda постоянно проводит тесты на совместимость с Web API. Вы можете проверить поддержку конкретных API на wpt.live.