중급 난이도, 약 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를 실행했다면 스크립트의 browserWSEndpoint를 ws://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의 지원 현황을 테스트할 수 있습니다.