解説
ヘッドレスブラウザは、通常のブラウザ(Chrome、Firefox、WebKit)が可視ウィンドウなしで動作するもので、ナビゲーション、DOM操作、レンダリングのためのプログラマティックAPI を公開しています。JavaScriptを実行し、CSSを適用し、クッキーを処理し、通常のブラウザと区別がつかない動作をします。唯一の違いは、UIウィンドウがなく、人間の入力もないことです。
スクレイピングにおいて、ヘッドレスブラウザは、取得したいデータがJavaScriptによってクライアントサイドでレンダリングされる場合に必要です。現代のウェブアプリ(React、Vue、Angular SPA)は、JSが実行された後に内容が補完される空のHTMLシェルを返すことが多く、`requests`や`axios`のような単純なHTTPクライアントは空のシェルしか見ることができません。ヘッドレスブラウザはページのライフサイクル全体を実行し、完全にレンダリングされたDOMを提供します。
主要なドライバーは、Playwright(Microsoft、マルチブラウザ)、Puppeteer(Google、Chrome/Firefox)、Selenium(古いWebDriverベース、最も広い言語サポート)です。それぞれ、ナビゲート、クリック、入力、要素の待機、ネットワークリクエストの傍受、コンテンツの抽出などのメソッドを提供しています。人間らしく見せる必要がある自動化作業では、ヘッドレスブラウザにステルスプラグインとレジデンシャルプロキシを組み合わせることが標準的な構成です。
仕組み
Playwright/Puppeteer/Seleniumを使用してヘッドレスブラウザを起動すると、ドライバーは`--headless`フラグを付けた実際のChromium(またはFirefox/WebKit)プロセスを開始し、デバッグプロトコル(Playwright/PuppeteerにはChrome DevTools Protocol、SeleniumにはWebDriver)を介して接続します。スクリプトはそのプロトコルを通じてコマンド(`page.goto`、`page.click`、`page.evaluate`)を送信し、ブラウザは人間のユーザーが操作しているかのようにそれらを実行します。
ブラウザは実際のブラウザが行うすべてのことを処理します。TLSハンドシェイク(独自のフィンガープリントを使用)、HTTP/2またはHTTP/3のネゴシエーション、クッキーの保存、JavaScriptの実行、レイアウト、描画、サブリソースのネットワークリクエストなどです。スクリプトはこれらのいずれかをインターセプトし、リクエスト/レスポンスを変更し、スクリプトを注入し、レンダリングされたDOMからデータを抽出できます。