プレイライトスティルスでボット検出を回避する:2026年のための9つの解決策
Expert Network Defense Engineer
TL;DR:
- Playwrightは指紋を漏らす。 デフォルトのヘッドレスChromiumインスタンスは、
navigator.webdriver、プラグインの欠如、予測可能なビューポートサイズといった自動化シグナルを発信します。 - PythonとNode.jsのエコシステムは異なる。 Pythonではv2.xコンテキストマネージャーを使用して
playwright-stealth、Node.jsではplaywright-extraを使ってこれらの漏れを修正します。 - ステルスには複数の層が必要。 最新の検出を回避するには、JavaScriptレイヤーの修正、ヘッダーのランダム化、プロキシのローテーション、セッションクッキーの管理を同時に行う必要があります。
- クラウドブラウザが残りを処理。 ローカルのステルスプラグインが高度なWAFに対して失敗した場合、ブラウザの実行を管理されたインフラにオフロードすることが唯一の信頼できるアップグレードパスです。
- 無料で開始。 新しいScrapelessアカウントには無料のスクレイピングブラウザランタイムが含まれています — app.scrapeless.comでサインアップしてください。
はじめに: デフォルトの自動化の限界
Playwrightは強力なブラウザ自動化ツールですが、初期設定のままではボットとして自己主張しています。ヘッドレスChromiumインスタンスを起動すると、navigator.webdriverフラグがtrueに設定され、標準のブラウザプラグインが欠如しており、特異なWebGL署名を持っています。Cloudflare、DataDome、Akamaiなどのモダンなアンチボットシステムはこれらのシグナルを読み取り、スクリプトがDOMを解析する前にリクエストをブロックします。
保護されたサイトをスクレイピングするには、Playwrightステルスが必要です。しかし、「ステルスモード」はPlaywrightライブラリに組み込まれたトグルではありません。これには、ブラウザ指紋の漏れを修正し、ネットワーク特性を管理し、人間の行動をエミュレートするための特定の手法を実装することが必要です。
このガイドでは、2025年にPlaywrightを使用してボット検出を回避するための9つの実用的な解決策を詳しく解説し、現代のウェブスクレイピングの複雑さを乗り越えるための詳細なコード例を提供します。
できること
- 基本的なボット検出を回避。
navigator.webdriverやUser-Agentの漏れを修正することで、デフォルトのヘッドレスブラウザをブロックするウェブサイトにアクセスします。 - ブラウザ指紋を標準化。 ヘッドレスChromiumインスタンスに対して現実的なハードウェアの同時実行、メモリ、プラグインデータを注入します。
- セッションの持続性を維持。 ステルスパッチと適切なクッキーおよびコンテキスト管理を組み合わせて、セッションをより長く生かします。
- データ抽出をスケール。 高ボリュームのスクレイピングタスクのために、並列にステルスパッチを施したブラウザコンテキストを実行します。
Scrapelessスクレイピングブラウザの理由
Scrapelessスクレイピングブラウザは、ウェブクローラーやAIエージェント向けにデザインされたカスタマイズ可能なアンチ検出クラウドブラウザです。ローカルのステルスプラグインが高度なWAFに対して限界に達したときには、次のものを提供します:
- 組み込みのアンチ検出。 JavaScriptパッチを超えるネイティブな指紋スプーフィング、TLSおよびTCPの指紋管理を含みます。
- 自動プロキシローテーション。 195か国で統合された住宅プロキシによりIPの評判問題を解決します。
- 管理されたチャレンジ解決。 Cloudflare Turnstile、reCAPTCHA、hCaptchaの自動解決。
- Playwrightとの互換性。 既存のPlaywrightスクリプトをCDP経由でクラウドブラウザに接続するために1行のコードが必要です。
無料プランでAPIキーを取得するには、app.scrapeless.comをご覧ください。
前提条件
- Node.js 18+またはPython 3.10+
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
- Playwright自動化の基本的な知識
Playwright Stealthでボット検出を回避するための9つの解決策
1. navigator.webdriverフラグを無効にする
自動化の最も一般的な指標の一つが、navigator.webdriverプロパティです。このプロパティは自動化されたブラウザ環境でtrueに設定されています。W3C WebDriver標準は、サーバーが自動化されたトラフィックを識別できるようにするためにこのフラグを定義しています。ウェブサイトはこのフラグを簡単にチェックしてボットを特定できます。それを無効にすることが基本的なステルステクニックです。
コードの操作手順:
page.add_init_script()を使って、サイトのスクリプトが実行される前にnavigator.webdriverプロパティを変更するJavaScriptを挿入します:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
# webdriverフラグを無効にするJavaScriptを挿入
context.add_init_script("""
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
""")
page = context.new_page()
page.goto("https://bot.sannysoft.com/")
page.screenshot(path="webdriver_disabled.png")
browser.close()
2. User-Agent文字列をランダム化
User-Agent ヘッダーは、ウェブサーバーにブラウザとオペレーティングシステムを識別します。一貫性のあるまたは古い User-Agent(特に HeadlessChrome を含むもの)を使用することは、ボットの強い指標です。User-Agent 文字列をランダム化することで、異なる正当なユーザーとして見えるのに役立ちます。
コード操作手順:
一般的な User-Agent 文字列のリストを保持し、各セッションごとにランダムに選択します:
python
from playwright.sync_api import sync_playwright
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0"
]
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context(user_agent=random.choice(user_agents))
page = context.new_page()
page.goto("https://www.whatismybrowser.com/detect/what-is-my-user-agent")
page.screenshot(path="random_user_agent.png")
browser.close()
3. プロキシを使用し、IPアドレスをローテーションする
同じIPアドレスからの繰り返しのリクエストは、ボット活動の主な指標です。プロキシプールを使用し、各リクエストまたはセッションのためにIPアドレスをローテーションすることで、トラフィックを分散し、IPベースのブロックを避けます。
コード操作手順:
Playwrightを使用してプロキシを設定します:
python
from playwright.sync_api import sync_playwright
import random
proxies = [
"http://user1:pass1@proxy1.example.com:8080",
"http://user2:pass2@proxy2.example.com:8080"
]
with sync_playwright() as p:
# ランダムに選択されたプロキシでブラウザを起動
browser = p.chromium.launch(headless=True, proxy={
"server": random.choice(proxies)
})
page = browser.new_page()
page.goto("https://www.whatismyip.com/")
browser.close()
大規模な操作のためには、ローテーションを自動的に処理する Scrapeless Proxies のような管理されたプロキシサービスの利用を検討してください。
4. 現実的なマウスの動きとキーボード入力をシミュレーションする
ボットはしばしばウェブ要素と直接かつ瞬時に対話するため、これは不自然です。アンチボットシステムは、カーソルの速度やキーストロークのリズムなどの 行動バイオメトリクス を追跡します。人間のようなマウスの動き、クリック、およびキーボード入力をシミュレートすることで、検出される可能性を減らします。
コード操作手順:
page.mouse および page.keyboard メソッドを使用して遅延とリアルなパスを導入します:
python
from playwright.sync_api import sync_playwright
import time
import random
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://www.example.com")
# 人間のようなタイピングをシミュレート
search_input = page.locator("#search-box")
search_input.click()
text_to_type = "Playwright Stealth"
for char in text_to_type:
page.keyboard.type(char)
time.sleep(random.uniform(0.05, 0.2)) # キー押下の間にランダムな遅延
page.keyboard.press("Enter")
browser.close()
5. クッキーとセッションデータを管理する
ウェブサイトはクッキーを使用してユーザーセッションを追跡します。リクエスト間にクッキーを削除するボットは、自動化トラフィックとして簡単に特定されます。クッキーを受け入れ、送信することで一貫したセッションを維持することが隠密にとって重要です。
コード操作手順:
context.storage_state() を使用してクッキーとローカルストレージを保存し、それを新しいセッションにロードします:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
# シナリオ 1:今のセッションのクッキーを保存する
context = browser.new_context()
page = context.new_page()
page.goto("https://www.example.com/login")
# ログインを実行...
# 状態を保存
context.storage_state(path="state.json")
browser.close()
# シナリオ 2:以前のセッションからクッキーをロード
browser2 = p.chromium.launch(headless=True)
context2 = browser2.new_context(storage_state="state.json")
page2 = context2.new_page()
page2.goto("https://www.example.com/dashboard")
browser2.close()
6. ビューポートサイズとデバイスエミュレーションを調整する
ウェブサイトはビューポートサイズや画面解像度を確認して異常を検出します。デフォルトの800x600ビューポートを使用することは一般的な警告サインです。一般的なデバイス構成をエミュレートすることで、実際のユーザートラフィックに溶け込むのに役立ちます。
コード操作手順:
新しいコンテキストを作成するときにviewport と user_agent を設定します:
python
from playwright.sync_api import sync_playwright
import random
viewports = [
{"width": 1920, "height": 1080}, # デスクトップ
{"幅": 1366, "高さ": 768}, # ラップトップ
]
with sync_playwright() as p:
ブラウザ = p.chromium.launch(headless=True)
選択されたビューポート = random.choice(viewports)
コンテキスト = ブラウザ.new_context(
viewport=選択されたビューポート
)
ページ = コンテキスト.new_page()
ページ.goto("https://www.deviceinfo.me/")
ブラウザ.close()
7. ヘッドレスモードの検出を回避する
ヘッドレスモードは効率的ですが、一部のアンチボットシステムは、グラフィックスレンダリングの機能が欠如しているかどうかを確認することで検出できます。特に侵害的なシステムに対しては、目に見えるブラウザインターフェースを持つヘッドフルモードでPlaywrightを実行することで、検出を回避できることがあります。
コード操作手順:
ブラウザを起動する際にheadless=Falseを設定します:
python
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
ブラウザ = p.chromium.launch(headless=False) # ヘッドフルモードで起動
ページ = ブラウザ.new_page()
ページ.goto("https://www.example.com")
ブラウザ.close()
8. playwright-stealthとplaywright-extraの使用
手動のJavaScriptインジェクションを書く代わりに、専用のステルスパッケージを使用します。Pythonエコシステムではplaywright-stealth、Node.jsではplaywright-extraとpuppeteer-extra-plugin-stealthを組み合わせて使用します。これらのライブラリは、自動でさまざまな回避策を適用し、ブラウザフィンガープリントを修正します。
コード操作手順 (Python):
パッケージをインストールし(pip install playwright-stealth)、v2.xコンテキストマネージャAPIを使用します:
python
import asyncio
from playwright_stealth import Stealth
from playwright.async_api import async_playwright
async def main():
# コンテキストマネージャが自動的にステルスパッチを適用します
async with Stealth().use_async(async_playwright()) as playwright:
ブラウザ = await playwright.chromium.launch(headless=True)
コンテキスト = await ブラウザ.new_context()
ページ = await コンテキスト.new_page()
await ページ.goto("https://bot.sannysoft.com/")
await ブラウザ.close()
asyncio.run(main())
9. アクションに遅延とランダム化を実装する
ボットはしばしば完璧なタイミングと速度でアクションを実行します。アクション間にランダムな遅延を導入し、インタラクションの速度を変えることで、スクリプトをより人間らしく見せることができます。
コード操作手順:
ランダムな間隔でtime.sleep()を使用します:
python
from playwright.sync_api import sync_playwright
import time
import random
with sync_playwright() as p:
ブラウザ = p.chromium.launch(headless=True)
ページ = ブラウザ.new_page()
ページ.goto("https://www.example.com")
# ランダムな遅延でブラウジングをシミュレート
time.sleep(random.uniform(2, 5)) # 初期ページロードの遅延
ページ.click("a[href='/products']")
ページ.locator("input[name='q']").fill("search item")
time.sleep(random.uniform(0.5, 1.5)) # タイピング後の遅延
ページ.keyboard.press("Enter")
ブラウザ.close()
無料プランでAPIキーを取得: app.scrapeless.com
結論: 基本的なステルスを超えて
Playwrightのステルスプラグインと振る舞いの調整は、基本的なウェブスクレイピングには不可欠ですが、厳しい限界があります。これらはJavaScriptレイヤーで動作し、TLSフィンガープリント、TCPウィンドウサイズを偽装したり、Cloudflare Turnstileのような複雑な行動課題を解決したりできません。
あなたのステルスパッチされたローカルブラウザが403エラーやCAPTCHAループを受け取り始めた場合、解決策はより多くのJavaScript回避策を書くことではありません。ブラウザの実行をマネージドインフラストラクチャ、たとえばScrapeless Scraping Browserにオフロードすることが解決策です。これはIPローテーション、TLSフィンガープリンティング、チャレンジの解決を自動的に処理しながら、あなたがPlaywrightのコードを保持できるようにします。
AI駆動のデータパイプラインを構築する準備はできましたか?
堅牢なデータ抽出システムを構築している開発者のコミュニティに参加しましょう。
- Discord: https://discord.gg/VU2vtbq7Q2
- Telegram: https://t.me/scrapeless
- サインアップ: app.scrapeless.com
FAQ
Q: Playwrightのステルスはライブラリに組み込まれていますか?
いいえ。Playwrightにはネイティブのステルスモードはありません。サードパーティのパッケージを使用する必要があります: Python用のplaywright-stealth、またはNode.js用のステルスプラグイン付きplaywright-extraです。
Q: ステルスプラグインはCloudflareを回避しますか?
ステルスプラグインは、基本的なブラウザフィンガープリントの漏洩を修正し、簡単なチェックに対して役立ちます。しかし、高度なCloudflareの課題(Turnstileのような)やIPの評判問題は解決しません。
Q: PlaywrightのステルスはFirefoxまたはWebKitで機能しますか?
いいえ。PythonとNode.jsのステルスパッケージにおける回避モジュールは、Chromium APIをパッチするために特別に設計されています。FirefoxやWebKitには対応していません。
Q: ステルスを使用してもプロキシは必要ですか?
はい。ステルスプラグインはブラウザのアイデンティティ(フィンガープリント)をマスクするだけで、IPアドレスを隠すことはありません。レート制限やIPベースのブロックを避けるために、住宅用プロキシが依然として必要です。
Q: Playwrightでのスクレイピングは合法ですか?
一般的に、公開されているデータのスクレイピングは許可されていますが、管轄区域によって異なります。ターゲットサイトの利用規約を確認し、特定の使用ケースについて法律相談を行ってください。
Q: AIエージェントなしでこれを実行できますか?
はい、Playwrightのコードは標準的な自動化スクリプトとしてエンドツーエンドで機能します。ブラウザステルスを実装するためにAIエージェントは必要ありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



