Playwrightを使ったプロキシの利用方法:必須ガイド
Scraping and Proxy Management Expert
TL;DR:
- Playwrightは1つの設定オプションからプロキシを操作します。
proxyパラメータはサーバー、ユーザー名、パスワードを受け取り、ローカルブラウザを起動する場合でもリモートブラウザに接続する場合でも同じ形で機能します。 - 住宅出口がヘッドレストラフィックを人間らしく見せます。 データセンターのIPレンジとデフォルトの自動化フィンガープリントは、一般的なサイトが最初にチェックする2つのシグナルです。実際の住宅アドレスを経由することで、最初のシグナルが除去されます。
- Scrapeless Scraping BrowserはChrome DevTools Protocolを話します。 Playwrightは
chromium.connectOverCDP(endpoint)で接続し、住宅プロキシとアンチディテクションをクラウドサイドで実行し、スクリプトはそのままPlaywrightのままです。 proxyCountryは出口地域を固定し、sessionNameとsessionTTLはナビゲーションの間に1つのIPを保持します。 ジオターゲティングとスティッキーセッションは接続文字列のクエリパラメータであり、追加のアプリケーションコードではありません。- 並列実行は独立したセッションを通じてスケールします。 同時に複数の接続を開くと、それぞれに固有の住宅IPが与えられ、同時使用の上限はありません。
- 始めるのは無料です。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。
はじめに: Playwrightプロキシと生の設定の終わり
Playwrightは、Chromium、Firefox、WebKitを単一のAPIから操作し、自動待機機能により、古い世代の自動化ツールよりもナビゲーションが壊れにくくなっています。それでも、Playwrightスクリプトがブロックされる理由は2つあります。ブラウザは検出スクリプトが読み取る自動化フィンガープリントを出荷し、ホストマシンが持つ任意のIPから接続します — 通常はクラウドまたはデータセンターのアドレスで、一般的なサイトではレート制限やジオ制限がかかります。住宅プロキシはその問題のネットワークの半分に対処し、アンチディテクションブラウザはフィンガープリントの半分に対処します。
このガイドはPlaywright自身のプロキシサポートから始まります。これはすべてのプロキシが接続するオプションです。その後、生のプロキシ設定が行き詰まる場所と、PlaywrightがChromium用にすでに使用している同じプロトコルを通じて接続されるクラウドブラウザに難しいケースを渡す方法を示します。
前提条件
- Node.js 18以降
- ScrapelessアカウントとAPIキー — app.scrapeless.comでサインアップ
- Playwrightがインストールされていること(
npm install playwright) - npmおよびNode.js環境変数に基本的な親しみがあること
インストール
1. プロジェクトにPlaywrightを追加
Playwrightがまだない場合は、インストールしてください:
bash
npm install playwright
これにより、すべての3つのブラウザエンジンのためのPlaywrightライブラリが取り込まれます。
2. Scrapeless APIキーを設定
キーを環境変数として保存し、ソース管理に残らないようにします:
bash
export SCRAPELESS_API_KEY="your_api_key_here"
3. ラッパーSDKは不要
PlaywrightはChrome DevTools Protocolを介してScrapeless Scraping Browserに接続するため、Playwright自体を超えて追加のパッケージはインストールする必要はありません。
Playwrightの組み込みプロキシを設定
Playwrightはlaunch()およびnewContext()でプロキシ設定を受け付けます。serverをプロキシゲートウェイに指し示し、認証情報を渡します:
javascript
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://your-proxy-host:8080', // あなたのプロキシゲートウェイ
username: 'your-proxy-user',
password: 'your-proxy-pass',
},
});
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com');
console.log(await page.title());
await browser.close();
})();
これが全体のライブラリレベルのインターフェースであり、Chromium、Firefox、WebKitで同じように機能します。これが行わない二つのこと:serverを指す住宅アドレスプールがすでにあることを前提とし、ブラウザの自動化フィンガープリントをそのままにします。生のプロキシ設定はトラフィックを新しいIPに移動させますが、ページがクライアントをどのように読み取るかは変更しません。
無料プランでAPIキーを取得してください: app.scrapeless.com
生のプロキシ設定が終わる場所 — フィンガープリントとIPソーシング
2つのギャップがlaunch({ proxy })と、パブリックサイトがクリーンにサービスを提供する自動化ランの間にあります。それは、リアルな住宅プールをソーシングし回転させることと、ブラウザが到着したときに提示するフィンガープリンツです。Scrapeless Scraping Browserはその両方を解決します。これはウェブクローラーやAIエージェントのために作られたアンチ検出クラウドブラウザであり、Chrome DevTools Protocolを使用しているため、Playwrightは1行で接続できます。特にPlaywrightのために、以下の機能を提供します:
- 195ヶ国以上に住宅出口ノード、自動化のフィンガープリンティングはクラウド側で処理されます。
- クラウド側のJavaScriptレンダリング — リモートブラウザがページを実行するため、作業はあなたのマシンから離れます。
- ジオターゲティングとスティッキーセッションを接続パラメータとして —
proxyCountry、sessionName、およびsessionTTLがエンドポイント文字列に運ばれます。 - 同時接続数の制限なし — 使用に応じて支払い、実行の必要に応じて任意の数のセッションを開くことができます。
接続文字列は、tokenパラメータとしてあなたのキーを運びます。docs.scrapeless.comにはすべてのオプションがリストされています。app.scrapeless.comで無料プランのAPIキーを取得してください。
CDP経由でPlaywrightを接続する
WebSocketエンドポイントを構築し、次にchromium.connectOverCDP()で接続します。そこからは普通のPlaywrightです — プロキシとフィンガープリンティングはすでにリモートブラウザに適用されています:
javascript
const { chromium } = require('playwright');
const token = process.env.SCRAPELESS_API_KEY;
const params = new URLSearchParams({
token,
proxyCountry: 'US', // 住宅出口地域を固定
sessionTTL: '300', // セッションを300秒間維持
});
const wsEndpoint = `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;
(async () => {
const browser = await chromium.connectOverCDP(wsEndpoint);
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://example.com', { waitUntil: 'domcontentloaded' });
console.log('タイトル:', await page.title());
// エグレスがホストマシンのIPではなく、住宅IPであることを確認
const ipPage = await context.newPage();
await ipPage.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
console.log('エグレス:', await ipPage.evaluate(() => document.body.innerText));
await browser.close();
})();
国を固定してIPを再利用する
ジオターゲティングはproxyCountryパラメータです。スティッキーさはsessionNameとライブsessionTTLにあります:ウィンドウ内で同じ名前を再利用すると、すべてのナビゲーションが同じ住宅IPから出発し、これによりログインフローが1つのアイデンティティに維持されます。
javascript
const { chromium } = require('playwright');
const token = process.env.SCRAPELESS_API_KEY;
function endpoint({ country, session }) {
const params = new URLSearchParams({
token,
proxyCountry: country,
sessionName: session, // 同じ名前 + ライブTTL = 同じ出口IP
sessionTTL: '300',
});
return `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;
}
(async () => {
const browser = await chromium.connectOverCDP(endpoint({ country: 'US', session: 'demo-session' }));
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
console.log('最初:', await page.evaluate(() => document.body.innerText));
await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
console.log('2回目:', await page.evaluate(() => document.body.innerText));
await browser.close();
})();
セッションを並行して実行する
各接続は独立しているので、ワーカー・プールは異なるセッション名を持ついくつかのエンドポイントに対してPromise.allです。丁寧な利用のために、ホストごとに同時接続数を3に制限します:
javascript
const { chromium } = require('playwright');
const token = process.env.SCRAPELESS_API_KEY;
function endpoint(session) {
const params = new URLSearchParams({ token, proxyCountry: 'US', sessionName: session, sessionTTL: '180' });
return `wss://browser.scrapeless.com/api/v2/browser?${params.toString()}`;
}
async function fetchIp(session) {
const browser = await chromium.connectOverCDP(endpoint(session));
try {
const page = await browser.newContext().then(c => c.newPage());
await page.goto('https://api.ipify.org?format=json', { waitUntil: 'domcontentloaded' });
return { session, ip: JSON.parse(await page.evaluate(() => document.body.innerText)).ip };
} finally {
await browser.close();
}
}
(async () => {
const workers = ['worker-1', 'worker-2', 'worker-3'];
javascript
const results = await Promise.all(workers.map(fetchIp));
console.log(results);
})();
受け取るもの
各セッションは異なる住宅出口を報告し、スティッキーセッションは同じものを二回報告します。上記の並列実行は、各ワーカーごとに一つのレコードを返します。
javascript
// 参考のサンプル — スキーマは正確です。IP値は参考用で、セッションごとに異なります。
[
{ "session": "worker-1", "ip": "72.188.194.89" },
{ "session": "worker-2", "ip": "172.56.218.152" },
{ "session": "worker-3", "ip": "73.135.52.138" }
]
スキーマの注意点:
proxyCountry: 'US'は各出口を米国の住宅住所に固定します。他の地域をターゲットにするにはコードを変更してください。- 一つの
sessionName内で、ライブsessionTTLが有効な間は、IPはナビゲーションを通じて一定です。新しい名前では新しいアドレスが取得されます。 - セレクターはターゲットサイトの現在のマークアップと一致させる必要があります。DOMが変動する際は、セレクターを厳密にしてください。
- リモートブラウザはデフォルトでJavaScriptをレンダリングするため、クライアントサイドのコンテンツはDOMを読む前に存在します。
トラブルシューティング
長時間の実行の途中で接続が切れる
原因: ワークフローが終了する前にsessionTTLが切れた。
修正: sessionTTLを最初からワークフロー全体をカバーするように設定してください。これはセッションの寿命を秒単位で指定するもので、期待される最長のナビゲーションチェーンに合うようにサイズを調整します。
サイトが「アクセスが拒否されました」ページをまだ表示する
原因: クリーンな住宅IPだけが唯一の信号ではありません。深いURLに直接ジャンプするコールドセッションは、自動化されているように見えます。
修正: 同じコンテキスト内でサイトのホームページを最初に読み込み、proxyCountryを視聴者に合わせた地域に固定し、コンテキストにリアルなオプション(userAgent, Accept-Language)を提供してください。
抽出結果が空のフィールドを返す
原因: セレクターがレンダリングされたマークアップと一致しなくなった。
修正: ページを再検査し、セレクターを厳密にしてください。オプションフィールドを保護して、要素が欠落している場合にはnullを返すようにします。
結論: アプリケーションコードから離れたプロキシレイヤー
プロキシされたPlaywrightの実行は、エンドポイントを構築し、CDP経由で接続し、国を固定し、すでに知っているPlaywrightを書くだけに減少します。ネイティブのlaunch({ proxy })は、プールを所有している場合をカバーし、Scraping Browserは、本物の住宅出口と耐えられるフィンガープリンタが必要な場合をカバーします。proxyCountryで出口を固定し、sessionNameとライブsessionTTLで一つのアイデンティティを保持し、ホストごとに同時接続は三つに制限し、欠落フィールドをnullとして扱います。ローテーション戦略については、best-rotating-proxies-2026を参照してください。
Playwrightとプロキシでスケール自動化の準備はできていますか?
私たちのコミュニティに参加して、無料プランを請求し、Playwright自動化を構築している開発者とつながりましょう: Discord · Telegram。
app.scrapeless.com で無料のScraping Browserランタイムにサインアップし、価格を確認し、上記のパターンを自動化のニーズに合わせて地域やサイトに調整してください。
FAQ
Q: Playwrightを使ったスクレイピングは違法ですか?
公開されているデータをスクレイプすることは広く許可されていますが、ルールは管轄地域やサイトの利用規約によって異なります。ターゲットの利用規約を確認し、使用する権限がないログインの背後にあるデータを避け、敏感な内容については弁護士に相談してください。
Q: プロキシは必要ですか?
データセンターIPをブロックするか、地理的制限を適用するターゲットに対しては常に必要です。これは、大多数の公共サイトをスケールでカバーします。住宅出口により、リクエストは通常のユーザーのトラフィックとして到着します。これがない場合、クラウドIPは簡単にブロックされます。
Q: 「アクセスが拒否されました」ページが表示されます - クリーンなレンダリングを得るにはどうすればいいですか?
同じコンテキスト内でサイトのホームページを最初に読み込んでセッションを温め、proxyCountryを視聴者に合った地域に固定し、userAgentやAccept-Languageなどのリアルなコンテキストオプションを設定します。コールドコンテキストからの深いURLヒットが通常のトリガーです。
Q: 同時に多くのPlaywrightセッションを実行できますか?
はい。各CDP接続は独立しており、それぞれの住宅IPを引き出しますので、ワーカープールは複数のエンドポイントでのPromise.allになります。それぞれ異なるsessionName値を持っています。同時接続はホストごとに三つに制限して礼儀正しさを保つようにしてください。
Q: 出口国を変更するにはどうすればいいですか?
proxyCountryパラメータを変更し、新しい接続を開きます。セッションが作成されると国が固定されるため、異なる地域はセッションの途中で変更するのではなく、新しいエンドポイント文字列を意味します。
Q: JavaScriptが重いサイトでもこの方法は機能しますか?
はい。リモートブラウザはあなたがページを読む前にページを実行するため、クライアントレンダリングされたコンテンツは page.goto() が解決される時点でDOMに存在しています。ネットワークがアイドル状態にならないサイトでは、waitUntil: 'domcontentloaded'を使用し、短い待機を加えてください。
Q: サイトのマークアップが変更された場合はどうなりますか?
特定のクラスや構造に結びついたセレクタは、サイトがデザインをリリースすると壊れてしまいます。最も安定したシグナルであるデータ属性やハッシュ化されたCSSクラスを用いた耐久性のあるURLパターンに基づくアンカー抽出を行い、フィールドが空で戻ってくるようになった時にセレクタを再チェックしてください。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



