プレイライト 크롤링 完全ガイド 2026 — インストールからアンチボット回避まで

Playwright 설치부터 크롤링 코드, 안티봇 우회까지 모두 정리했습니다. Python 및 Node.js 실전 예제가 포함되어 있습니다. Selenium과 Puppeteer의 속도 및 안정성 비교표도 확인해보세요.

23,763
プレイライト 크롤링 完全ガイド 2026 — インストールからアンチボット回避まで
目次

Playwrightは、2026年現在、最も広く使用されているオープンソースブラウザ自動化ツールであり、動的ウェブサイトのクローリングに使用されます。Microsoftが開発し、Chromium、Firefox、WebKitを1つのAPIで制御し、PythonとNode.jsの両方をサポートしています。JavaScriptレンダリングページ、ログインが必要なサービス、無限スクロールフィードなど、RequestsやBeautifulSoupでは処理できない環境で、実際のブラウザを起動してデータを抽出します。

要約
- PlaywrightはSeleniumよりも高速で、自動待機、ネットワークインターセプト、並列処理をデフォルトでサポートしています
- Pythonでは2行(pip install playwright + playwright install)でインストールが完了します
- 2025年に登場したCloudflare AI Labyrinthなどの新しいアンチボットが進化し、playwright-stealthだけでは限界があります
- MCP(Model Context Protocol)統合により、AIエージェントがブラウザを直接制御する時代が到来しました
- 月間30万件以上のプロダクションクローリングは、自社構築(月額590〜1,030万ウォン)とマネージドサービス(月額300万ウォン〜)を比較する必要があります

この記事では、Playwrightのインストール、基本的な中級クローリングコード、SeleniumとPuppeteerの比較表、アンチボット回避戦略、MCPエコシステム、コスト分析までを1つの記事にまとめます。


1. Playwrightとは何か — クローリングになぜ使うのか?

Playwrightは、Microsoftが2020年に公開したオープンソースブラウザ自動化フレームワークです。Chromium、Firefox、WebKit(Safariエンジン)の3つのブラウザを1つのAPIで制御でき、Python、Node.js、Java、C#をすべてサポートしています。

クローリングの観点から、Playwrightが注目される理由は3つあります。

自動待機(auto-wait): page.locator()で要素を選択すると、その要素が画面に表示されるまで自動的に待機します。time.sleep()などの従来のタイミング調整が不要です。

ネットワークインターセプト: ページの読み込み中に発生するすべてのHTTPリクエストをキャプチャして変更できます。Web UIを介さずに内部APIを直接呼び出すことで、データ収集速度を大幅に向上させることができます。

マルチコンテキスト: 1つのブラウザインスタンスで複数の独立セッションを同時に実行できるため、並列クローリングが効率的です。


2. Playwright、Selenium、Puppeteerのどれを選択すべきか?

新規プロジェクトを開始する際に、どのツールを使用すべきかという質問がよくあります。3つのツールの主な違いを表にまとめました。

項目 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の出力も1行で処理できます。

# 스크린샷 저장
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

関連ガイド: Coupangクローリング完全ガイド | Instagramクローリング完全ガイド


6. アンチボットシステムはどのように回避するか?(2026年最新テクニック)

Coupang、Naver、Instagramなどの主要プラットフォームは、Cloudflare Turnstile、DataDome、Akamai Bot Managerなどの高度なアンチボットシステムを運用しています。2026年現在、よく使用される対策方法をまとめます。

playwright-stealthの適用

playwright-stealthは、ヘッドレスブラウザを検出する代表的なシグナルをパッチしてくれます。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サーバー

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は、AIレイヤーをPlaywrightの上に重ねたフレームワークです。"次のページボタンをクリックして"などの自然言語で指示すると、AIがDOMを解析し、該当要素を見つけて動作します。サイト構造が変更されても、再コーディングなしに動作するのが主な利点です。

Hashscraper MCPサーバー

クローリング専用のMCPサーバーを探している場合は、Hashscraperが提供する@scrapi.ai/mcp-serverを参照することができます。Playwrightインフラを直接構築せずに、MCPコマンド1行でクローリング結果を取得できます。

関連ガイド: AIエージェントクローリング完全ガイド


8. Playwrightだけで十分ですか?制限と現実的な代替手段

Playwright自体の制限

Playwrightは強力なツールですが、プロダクション環境で継続的に運用する際には、いくつかの現実的な制限に直面します。

  • IPブロック: 同じIPから繰り返しリクエストがあるとブロックされます。プロキシプールの管理が必須であり、国内IPの入手が困難です。
  • アンチボットの更新: Cloudflare、DataDomeなどは、継続的に検出ロジックを更新しています。今日動作していた回避コードが明日は遮断される可能性があります。
  • インフラ運用負担: クローリングスケジューラ、エラー回復、データパイプライン、モニタリングシステムなどを別途構築する必要があります。

自社構築 vs マネージドサービスのコスト比較

月間30万件のデータ収集を基準にコストを比較すると、次のようになります。

項目 自社Playwrightインフラ Hashscraperサブスクリプション
開発者の給与(シニア基準) 月額500~700万ウォン 含まれる
プロキシ/IPコスト 月額50~200万ウォン 含まれる
サーバーインフラ(AWSなど) 月額20~80万ウォン 含まれる
アンチボット対応更新 月額20~50万ウォン(労力) 含まれる
合計月額 月額590~1,030万ウォン 月額300万ウォン〜
初期構築期間 1~3ヶ月 1~2週間
IPブロック発生時 直接対応 自動処理

"コードを書くこと"と"安定的に運用すること"は異なる問題です。開発スタックが明確なサイドプロジェクトや内部ツールであれば、Playwrightの直接構築が最適です。しかし、ビジネス目的で長期間安定的なデータ収集

コメント

コメントする

メールアドレスは公開されず、返信通知にのみ使用されます。

続けて読む

Get notified of new posts

We'll email you when 해시스크래퍼 기술 블로그 publishes new content.

Your email will only be used for new post notifications.