Lightpanda: Chrome보다 11배 빠른 AI 크롤링 브라우저

March 15, 2026

중급 난이도, 약 20분 소요. 가벼운 headless 브라우저를 사용하여 AI 데이터 수집을 배우며, Chrome보다 11배 빠르고 메모리 사용량은 9배 적습니다.

대상 독자

  • 대규모 웹 크롤링이 필요한 엔지니어
  • AI/LLM 데이터 수집 개발자
  • 자동화 테스트 엔지니어
  • 고성능 브라우저 기술에 관심이 있는 기술 애호가

핵심 의존성 및 환경

  • Linux x86_64 또는 macOS aarch64
  • Windows는 WSL2 필요
  • Docker (선택 사항, 프로덕션 환경 권장)
  • Node.js 18+ (Puppeteer/Playwright 스크립트 실행용)

TIP

Windows를 사용 중이라면 WSL2에 Lightpanda를 설치하고, Windows 호스트에서 Puppeteer를 실행하세요.

전체 프로젝트 구조

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

이렇게 하면 9222 포트에서 대기하는 CDP 서버가 즉시 실행됩니다.

컨테이너 실행 확인:

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';

// WebSocket을 통해 Lightpanda의 CDP 서버에 연결
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

Docker로 Lightpanda를 실행했다면 스크립트의 browserWSEndpointws://localhost:9222로 변경하세요.

5단계: 초고속 크롤링 체험

Lightpanda 공식 데이터에 따르면:

  • 속도: Chrome보다 11배 빠름
  • 메모리: Chrome보다 9배 적게 사용
  • 시작: 즉시 실행 (headless 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는 현재 베타 단계이므로 Web API 커버리지가 완전하지 않습니다. GitHub에 issue를 제기하면 팀에서 보통 빠르게 응답합니다.

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

해결: Lightpanda CDP 서버가 실행 중인지, 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: Puppeteer 대신 Playwright를 사용하고 싶음

증상: 통합 방법을 모름

해결: 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 호환성 테스트를 지속적으로 진행하고 있습니다. wpt.live에서 특정 API의 지원 현황을 테스트할 수 있습니다.

Updated March 15, 2026