Playwright는 2026년 기준 동적 웹사이트 크롤링에 가장 널리 쓰이는 오픈소스 브라우저 자동화 도구입니다. Microsoft가 개발했으며, Chromium·Firefox·WebKit을 하나의 API로 제어하고 Python과 Node.js를 모두 지원합니다. JavaScript 렌더링 페이지, 로그인이 필요한 서비스, 무한 스크롤 피드처럼 Requests나 BeautifulSoup으로 처리할 수 없는 환경에서 실제 브라우저를 구동해 데이터를 추출합니다.
TL;DR
- Playwright는 Selenium보다 빠르고 자동 대기·네트워크 인터셉션·병렬 처리를 기본 지원한다
- Python 2줄(pip install playwright+playwright install)로 설치가 끝난다
- 2025년 등장한 Cloudflare AI Labyrinth 등 안티봇이 고도화되어, playwright-stealth만으로는 한계가 있다
- MCP(Model Context Protocol) 연동으로 AI 에이전트가 브라우저를 직접 제어하는 시대가 열렸다
- 월 30만 건 이상 프로덕션 크롤링은 자체 구축(월 590~1,030만원) vs 매니지드 서비스(월 300만원~)를 비교할 것
이 글에서는 Playwright 설치, 기초·중급 크롤링 코드, Selenium·Puppeteer 비교표, 안티봇 우회 전략, MCP 생태계, 비용 분석까지 한 글에 정리합니다.
1. Playwright란 무엇인가 — 왜 크롤링에 쓰는가?
Playwright는 Microsoft가 2020년 공개한 오픈소스 브라우저 자동화 프레임워크입니다. Chromium, Firefox, WebKit(Safari 엔진) 세 가지 브라우저를 하나의 API로 제어할 수 있고, Python, Node.js, Java, C#을 모두 지원합니다.
크롤링 관점에서 Playwright가 주목받는 이유는 세 가지입니다.
자동 대기(auto-wait): page.locator()로 요소를 선택하면 해당 요소가 화면에 나타날 때까지 자동으로 기다립니다. time.sleep()으로 타이밍을 맞추는 고전적 방식이 필요 없습니다.
네트워크 인터셉션: 페이지 로딩 중 발생하는 모든 HTTP 요청을 가로채고 수정할 수 있습니다. 웹 UI 없이 내부 API를 직접 호출하는 방식으로 데이터 수집 속도를 크게 높일 수 있습니다.
멀티 컨텍스트: 하나의 브라우저 인스턴스에서 여러 독립 세션을 동시에 실행할 수 있어 병렬 크롤링이 효율적입니다.
2. Playwright, Selenium, Puppeteer 중 무엇을 선택해야 하나요?
신규 프로젝트를 시작할 때 어떤 도구를 써야 하는지 자주 묻는 질문입니다. 세 도구의 핵심 차이를 표로 정리했습니다.
| 항목 | Playwright | Selenium | Puppeteer |
|---|---|---|---|
| 출시 | 2020 | 2004 | 2018 |
| 브라우저 지원 | Chromium, Firefox, WebKit | 모든 브라우저 | Chromium 전용 |
| 언어 지원 | Python, JS/TS, Java, C# | 7개 언어 | Node.js 전용 |
| 자동 대기 | 기본 내장 | 수동 설정 필요 | 수동 설정 필요 |
| 실행 속도 | 가장 빠름 | 느림 | 빠름 |
| 병렬 처리 | BrowserContext 기본 제공 | 별도 구현 필요 | 별도 구현 필요 |
| 스텔스 지원 | playwright-stealth | selenium-wire | puppeteer-extra |
| 유지보수 | Microsoft 적극 개선 | 커뮤니티 운영 | Google 개선 |
| 커뮤니티 | 빠르게 성장 중 | 성숙, 레거시 많음 | 중간 |
2026년 기준 권장 선택:
- Playwright: 신규 프로젝트, 동적 웹사이트, 멀티 브라우저 대응이 필요한 경우
- Selenium: 기존 레거시 시스템과의 호환, IE 등 구형 브라우저가 필요한 경우
- Puppeteer: Chrome 전용으로 충분하고 Node.js 생태계에 익숙한 경우
3. Playwright는 어떻게 설치하나요?
Python 환경
# Playwright 설치
pip install playwright
# 브라우저 바이너리 설치 (Chromium, Firefox, WebKit 세 가지 모두)
playwright install
# Chromium만 설치하려면
playwright install chromium
Node.js 환경
# 새 프로젝트 초기화 (대화형 설정)
npm init playwright@latest
# 또는 직접 설치
npm install playwright
npx playwright install
Docker 환경
로컬 개발 환경이 아닌 서버에서 실행할 경우 Microsoft가 제공하는 공식 Docker 이미지를 사용하는 것이 가장 간편합니다.
FROM mcr.microsoft.com/playwright/python:v1.58.0-noble
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "crawler.py"]
4. 기본 크롤링 — 5분 만에 첫 데이터 추출
Python 예제: 뉴스 헤드라인 수집
from playwright.sync_api import sync_playwright
def scrape_headlines():
with sync_playwright() as p:
# headless=True 로 설정하면 브라우저 창 없이 실행
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://news.ycombinator.com")
# 모든 뉴스 제목 선택
items = page.locator(".titleline > a").all()
headlines = [item.inner_text() for item in items]
for i, title in enumerate(headlines[:10], 1):
print(f"{i}. {title}")
browser.close()
return headlines
if __name__ == "__main__":
scrape_headlines()
Node.js 예제: 동일 작업
const { chromium } = require('playwright');
async function scrapeHeadlines() {
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto('https://news.ycombinator.com');
const headlines = await page.locator('.titleline > a').allInnerTexts();
headlines.slice(0, 10).forEach((title, i) => {
console.log(`${i + 1}. ${title}`);
});
await browser.close();
return headlines;
}
scrapeHeadlines();
스크린샷 저장과 PDF 출력도 한 줄로 처리할 수 있습니다.
# 스크린샷 저장
page.screenshot(path="screenshot.png", full_page=True)
# PDF 저장 (Chromium만 지원)
page.pdf(path="page.pdf")
5. 실전 크롤링 기법 — 중급
페이지네이션 자동 처리
from playwright.sync_api import sync_playwright
def scrape_paginated(base_url, max_pages=5):
results = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
for page_num in range(1, max_pages + 1):
page.goto(f"{base_url}?page={page_num}")
# 요소가 로드될 때까지 대기
page.wait_for_selector(".product-item")
items = page.locator(".product-item").all()
for item in items:
results.append(item.inner_text())
# 다음 페이지 버튼이 없으면 종료
if not page.locator(".next-page").count():
break
browser.close()
return results
무한 스크롤 대응
def scrape_infinite_scroll(url, scroll_count=10):
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(url)
prev_count = 0
for _ in range(scroll_count):
# 페이지 맨 아래까지 스크롤
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
# 새 콘텐츠 로딩 대기
page.wait_for_timeout(1500)
current_count = page.locator(".item").count()
if current_count == prev_count:
break # 더 이상 로딩되지 않으면 종료
prev_count = current_count
items = page.locator(".item").all_inner_texts()
browser.close()
return items
네트워크 인터셉션 — API 직접 추출
JavaScript 렌더링 페이지에서 내부 API 응답을 직접 캐치하면 HTML 파싱 없이 깔끔한 JSON 데이터를 얻을 수 있습니다.
import json
def intercept_api(url):
captured_data = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
# API 응답을 가로채는 핸들러 등록
def handle_response(response):
if "api/products" in response.url and response.status == 200:
try:
data = response.json()
captured_data.extend(data.get("items", []))
except Exception:
pass
page.on("response", handle_response)
page.goto(url)
page.wait_for_load_state("networkidle")
browser.close()
return captured_data
멀티 페이지 병렬 처리
from playwright.sync_api import sync_playwright
def scrape_parallel(urls):
results = {}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
# BrowserContext로 독립 세션 생성
context = browser.new_context()
pages = [context.new_page() for _ in urls]
for page, url in zip(pages, urls):
page.goto(url, wait_until="domcontentloaded")
for page, url in zip(pages, urls):
results[url] = page.title()
browser.close()
return results
관련 가이드: 쿠팡 크롤링 완전 가이드 | 인스타그램 크롤링 완전 가이드
6. 안티봇 시스템은 어떻게 우회하나요? (2026년 최신 기법)
쿠팡, 네이버, 인스타그램 등 주요 플랫폼은 Cloudflare Turnstile, DataDome, Akamai Bot Manager 등 정교한 안티봇 시스템을 운영합니다. 2026년 기준으로 자주 쓰이는 대응 방법을 정리합니다.
playwright-stealth 적용
playwright-stealth는 headless 브라우저를 탐지하는 대표적인 시그널들을 패치해줍니다. navigator.webdriver 속성 제거, User-Agent 수정, WebGL 렌더러 위장 등을 자동으로 처리합니다.
pip install playwright-stealth
from playwright.sync_api import sync_playwright
from playwright_stealth import stealth_sync
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
stealth_sync(page) # 스텔스 적용
page.goto("https://target-site.com")
User-Agent 로테이션
import random
USER_AGENTS = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
]
context = browser.new_context(
user_agent=random.choice(USER_AGENTS)
)
프록시 설정
context = browser.new_context(
proxy={
"server": "http://proxy-server:8080",
"username": "user",
"password": "password"
}
)
인간 행동 시뮬레이션
import random
# 마우스 움직임 추가
page.mouse.move(
random.randint(100, 800),
random.randint(100, 600)
)
# 자연스러운 타이핑 딜레이
page.locator("#search").type("검색어", delay=random.randint(80, 150))
# 스크롤 후 짧은 대기
page.evaluate("window.scrollBy(0, 300)")
page.wait_for_timeout(random.randint(800, 2000))
2026년 주요 안티봇 트렌드
Cloudflare AI Labyrinth: Cloudflare가 2025년 3월 발표한 새로운 방어 방식입니다. 봇이 차단되는 대신 AI가 생성한 가짜 페이지의 미로로 유도합니다. 사람이라면 절대 4단계 이상 탐색하지 않을 구조이므로, 깊이 진입한 클라이언트는 자동으로 봇으로 판정되어 핑거프린트가 등록됩니다. 단순한 차단이 아닌 식별과 추적이 목적입니다.
Canvas/WebGL 핑거프린팅: 안티봇 시스템은 Canvas 렌더링 결과값, WebGL 렌더러 정보, AudioContext 처리 결과를 조합해 브라우저 고유 핑거프린트를 생성합니다. playwright-stealth 단독으로는 이를 완전히 우회하기 어렵고, browserforge와 같은 별도 핑거프린트 위장 라이브러리를 함께 사용해야 합니다.
한계: playwright-stealth 공식 문서에서도 명시하듯, 이 라이브러리는 단순한 탐지만 우회합니다. DataDome, Akamai 수준의 엔터프라이즈 안티봇을 상대로는 개별 우회 기법의 효과가 제한적입니다.
관련 가이드: 크롤링 합법성 완전 가이드
7. 2026년 Playwright 생태계 — MCP와 AI 자동화
Playwright MCP Server
2026년 들어 Playwright 생태계에서 가장 주목받는 변화는 MCP(Model Context Protocol) 연동입니다. Microsoft가 공식 배포한 playwright-mcp 패키지를 사용하면 Claude, GPT, Cursor 같은 AI 에이전트가 자연어 명령만으로 브라우저를 직접 제어할 수 있습니다.
# Claude Desktop에 Playwright MCP 연동
npx @playwright/mcp@latest
AI 에이전트가 "이 페이지의 상품 목록을 가져와줘"라고 지시하면 MCP 서버가 이를 Playwright 명령으로 변환해 실행하고 결과를 반환합니다. 코드를 직접 작성하지 않아도 브라우저 자동화가 가능해지는 방식입니다.
다만 토큰 소비 측면에서는 주의가 필요합니다. Microsoft 벤치마크에 따르면 동일 작업 기준으로 Playwright MCP는 약 114,000 토큰, Playwright CLI는 약 27,000 토큰을 소비합니다. 대규모 반복 작업에는 CLI 방식이 비용 효율적입니다.
Stagehand / Browser Use
Stagehand(Browserbase)와 Browser Use는 Playwright 위에 AI 레이어를 얹은 프레임워크입니다. "다음 페이지 버튼을 클릭해"처럼 자연어로 지시하면 AI가 DOM을 분석해 해당 요소를 찾아 동작합니다. 사이트 구조가 변경되어도 재코딩 없이 동작한다는 것이 핵심 장점입니다.
해시스크래퍼 MCP 서버
크롤링 전용 MCP 서버를 찾는다면 해시스크래퍼가 제공하는 @scrapi.ai/mcp-server를 참고할 수 있습니다. Playwright 인프라를 직접 구축하지 않고도 MCP 명령 한 줄로 크롤링 결과를 받을 수 있습니다.
관련 가이드: AI 에이전트 크롤링 완전 가이드
8. Playwright만으로 충분한가요? 한계와 현실적 대안
Playwright 자체의 한계
Playwright는 강력한 도구이지만 프로덕션 환경에서 지속적으로 운영할 때는 여러 현실적 한계에 부딪힙니다.
- IP 차단: 동일 IP에서 반복 요청이 들어오면 차단됩니다. 프록시 풀 관리가 필수이며, 국내 IP는 구하기가 까다롭습니다.
- 안티봇 업데이트: Cloudflare, DataDome 등은 지속적으로 탐지 로직을 업데이트합니다. 오늘 작동하던 우회 코드가 내일은 막힐 수 있습니다.
- 인프라 운영 부담: 크롤링 스케줄러, 에러 복구, 데이터 파이프라인, 모니터링 시스템까지 직접 구축해야 합니다.
자체 구축 vs 매니지드 서비스 비용 비교
월 30만 건 데이터 수집을 기준으로 비용을 비교하면 다음과 같습니다.
| 항목 | 자체 Playwright 인프라 | 해시스크래퍼 구독 |
|---|---|---|
| 개발자 인건비 (시니어 기준) | 월 500~700만원 | 포함 |
| 프록시/IP 비용 | 월 50~200만원 | 포함 |
| 서버 인프라 (AWS 등) | 월 20~80만원 | 포함 |
| 안티봇 대응 업데이트 | 월 20~50만원 (공수) | 포함 |
| 총 월 비용 | 590~1,030만원 | 월 300만원~ |
| 초기 구축 기간 | 1~3개월 | 1~2주 |
| IP 차단 발생 시 | 직접 대응 | 자동 처리 |
"코드를 짤 줄 아는 것"과 "안정적으로 운영하는 것"은 다른 차원의 문제입니다. 개발 스택이 분명한 사이드 프로젝트나 내부 도구라면 Playwright 직접 구축이 적합합니다. 하지만 비즈니스 목적으로 장기간 안정적인 데이터 수집이 필요하다면 인프라 운영 비용과 리스크를 함께 고려해야 합니다.
해시스크래퍼 무료 상담 예약에서 현재 수집 규모와 요구사항을 공유하면 최적 방안을 제안해 드립니다.
관련 가이드: 웹 크롤링 서비스 비교 가이드 | 크롤링 외주 비용 완전 가이드
9. FAQ
Q1. Playwright 크롤링은 합법인가요?
공개된 데이터를 수집하는 것 자체는 대부분의 국가에서 합법입니다. 다만 사이트의 robots.txt 지침을 무시하거나, 로그인 우회, 저작권 있는 콘텐츠 무단 복제, 서버 과부하 유발 등은 법적 문제가 될 수 있습니다. 한국에서는 2024년 배달의민족 크롤링 관련 판결에서 서비스 약관 위반과 업무 방해 여부가 쟁점이 되었습니다. 수집 목적과 방식에 따라 판단이 달라지므로, 상업적 규모의 크롤링이라면 법률 검토를 권장합니다. 자세한 내용은 크롤링 합법성 가이드를 참고하세요.
Q2. Playwright와 Selenium, 어느 것을 선택해야 하나요?
2026년 기준 신규 프로젝트라면 Playwright를 권장합니다. 자동 대기, 멀티 브라우저 지원, 병렬 처리, 빠른 실행 속도에서 모두 앞섭니다. Selenium은 레거시 시스템과의 호환이나 특수 브라우저가 필요한 경우에 유효합니다.
Q3. headless와 headed 모드의 차이는 무엇인가요?
headless=True는 브라우저 창을 띄우지 않고 백그라운드에서 실행하는 모드입니다. 서버 환경에서는 headless가 기본입니다. headless=False(headed 모드)는 실제 브라우저 창이 뜨며 동작을 눈으로 확인할 수 있어 디버깅에 유용합니다. 일부 안티봇 시스템은 headless 브라우저를 더 쉽게 탐지하므로, 우회가 필요할 때 headed 모드를 시도하는 것도 방법입니다.
Q4. Cloudflare 보호 사이트도 크롤링할 수 있나요?
Cloudflare Turnstile이나 Bot Management가 적용된 사이트는 playwright-stealth만으로 우회하기 어렵습니다. 주거용 IP 프록시, fingerprint 위장, 인간 행동 시뮬레이션을 조합해도 성공률이 불안정합니다. 2025년 등장한 AI Labyrinth는 봇을 차단하는 대신 가짜 페이지 미로로 유도해 리소스를 낭비시키는 방식이라 더욱 감지가 어렵습니다. 상업적 규모의 Cloudflare 대응은 전문 서비스를 활용하는 것이 현실적입니다.
Q5. Playwright 크롤링 속도를 높이려면 어떻게 해야 하나요?
크롤링 속도 향상을 위한 핵심 방법은 세 가지입니다. 첫째, 이미지·폰트·CSS 등 불필요한 리소스를 네트워크 인터셉션으로 차단합니다. 둘째, BrowserContext를 사용해 여러 페이지를 병렬로 실행합니다. 셋째, 가능하다면 HTML 파싱 대신 내부 API 응답을 직접 캡처합니다. 이 세 가지만 적용해도 속도가 3~5배 향상되는 경우가 많습니다.
Q6. 대규모 크롤링에 Playwright가 적합한가요?
단일 서버에서 Playwright를 실행하는 방식은 월 수만 건~수십만 건 수준까지는 적합합니다. 그 이상이 되면 분산 큐(Celery, RQ 등), 다중 서버, 프록시 풀 관리, 에러 복구 시스템을 별도로 구축해야 합니다. 월 30만 건 이상 규모라면 직접 구축보다 매니지드 서비스를 비교 검토할 시점입니다.
Q7. Python과 Node.js 중 어떤 것이 좋나요?
데이터 과학, 분석, 머신러닝 파이프라인과 연결해야 한다면 Python이 유리합니다. 기존 Node.js 백엔드와 통합하거나 TypeScript 타입 안전성이 필요하다면 Node.js를 선택합니다. Playwright 자체의 기능 차이는 거의 없습니다. 팀이 더 익숙한 언어를 선택하는 것이 가장 현실적입니다.
결론
Playwright는 2026년 기준 동적 웹사이트 크롤링에서 가장 강력한 오픈소스 도구입니다. 자동 대기, 네트워크 인터셉션, 병렬 처리, Python/Node.js 이중 지원, 그리고 MCP를 통한 AI 에이전트 연동까지 — 기능 측면에서는 단연 앞섭니다.
하지만 "작동하는 코드를 짜는 것"과 "프로덕션 환경에서 안정적으로 운영하는 것"은 다릅니다. IP 차단 대응, 안티봇 업데이트 추적, 인프라 운영은 Playwright 코드 작성과는 별개의 문제입니다. 내부 도구나 소규모 프로젝트라면 직접 구축이 최선입니다. 비즈니스 목적으로 월 30만 건 이상을 안정적으로 수집해야 한다면, 인프라 구축 비용과 운영 리스크를 함께 고려하는 것이 합리적입니다.
해시스크래퍼는 8년간 5,000개 이상의 사이트를 크롤링해온 매니지드 서비스입니다. Playwright 인프라를 직접 운영하기 전에 무료 상담으로 현재 요구사항을 공유해보세요.




