Geonode logo
Carl Gamutan

Carl Gamutan

更新日:2026年10月7日

公開日:2022年4月8日

Puppeteerでプロキシを使用する方法

Puppeteer は、ユーザーに高水準のヘッドレス Chrome API を提供する Node.js ライブラリです。ここでは、そのためのプロキシサーバーの作成方法をご紹介します!

Puppeteerにプロキシが必要な理由

Puppeteer用のプロキシを使用すると、ツールは常に実行中のマシンのIPアドレスを使用するのではなく、別のIPアドレス経由で接続できるようになります。これは、位置情報に基づくタスクや、テスト、監視、その他接続元が重要な作業において役立ちます。

Puppeteerは依然としてメインのタスクを処理します。接続元を管理するのはプロキシの役割です。

プロキシがないとどうなるか:IPブロック、レート制限、地域制限

プロキシがないと、ウェブサイトには常に同じIPアドレスが認識されます。アクティビティが増えると、そのIPアドレスがレート制限にかかったり、ブロックされたりする可能性があります。

所在地も重要な要素となります。ドイツからアクセスしたページと、米国からアクセスしたページでは、表示されるコンテンツが異なる場合があります。

Puppeteer用のプロキシを使用すれば、必要に応じて異なるIPアドレスや所在地から接続することが可能になります。

Puppeteer で使用するプロキシの種類

適切なプロキシの種類は、作業内容によって異なります。

プロキシの種類スクレイピングアカウント管理テストモニタリング
レジデンシャル所在地やIPの送信元が重要な場合に適しているアカウントにレジデンシャルIPが必要な場合に有用所在地に基づくテストに適している異なる場所からのコンテンツ確認に有用
ISP安定したIPが必要な場合に適している1つのIPで長時間のセッションを行う際に有用一貫したIPでのテストに適している同じIPからの継続的なチェックに有用
データセンター速度や大量のリクエストに適しているレジデンシャルIPが不要な場合に適している一般的なテストに適している頻繁な自動チェックに適している

住宅用プロキシは、IPの送信元や場所が重要な場合に役立ちます。ISPプロキシは、同じIPを長期間アクティブに保つ必要がある場合に適しています。データセンタープロキシは、速度とスケールが主な焦点となる場合に適しています。

最適な選択肢は、そのタスクにジオターゲティング、安定した接続、あるいはより大規模なIPプールへのアクセスが必要かどうかも左右します。

Puppeteerでプロキシを接続する方法

Puppeteerのプロキシ設定には、Geonodeのホスト、ポート、ユーザー名、パスワードが必要です。これらの認証情報を環境変数に保存し、コード内でプロキシを設定する際に読み込みます。

Geonode をご利用ですか? ユーザー名とパスワードは アクセス認証情報 から、ホスト、ポート、プロトコルは プロキシサーバー情報 から取得してください。

設定パスまたはコード

Puppeteer では、ブラウザを起動する際に ``--proxy-server`

` を通じてプロキシのホスト名とポート番号を指定します:

import puppeteer from "puppeteer";
import "dotenv/config";

const browser = await puppeteer.launch({
  headless: true,
  args: [
    `--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
  ],
});

次に、ページを作成し、プロキシの認証情報を指定します:

const page = await browser.newPage();

await page.authenticate({
  username: process.env.GEONODE_PROXY_USER,
  password: process.env.GEONODE_PROXY_PASS,
});

実際のユーザー名とパスワードは、ソースファイルに直接記述するのではなく、環境変数に格納しておいてください。この設定により、テストではプロキシ経由で HTTP 200 が正常に返されました。

認証形式「host:port:user:pass」

Geonode

を実行すると、4つの値が返されます:

proxy.geonode.io:PORT:USERNAME:PASSWORD

Puppeteer を使用する場合は、これらの値を個別に保持してください。環境変数に格納します:

GEONODE_PROXY_HOST=proxy.geonode.io
GEONODE_PROXY_PORT=9000
GEONODE_PROXY_USER=USERNAME
GEONODE_PROXY_PASS=PASSWORD

--proxy-server

を通じてホストとポートを読み込み、ページに対して認証を行います:

const browser = await puppeteer.launch({
  headless: true,
  args: [
    `--proxy-server=http://${process.env.GEONODE_PROXY_HOST}:${process.env.GEONODE_PROXY_PORT}`,
  ],
});

const page = await browser.newPage();

await page.authenticate({
  username: process.env.GEONODE_PROXY_USER,
  password: process.env.GEONODE_PROXY_PASS,
});

有効な認証情報でテストしたところ、HTTP 200 が返されました。パスワードが間違っていた場合、プロキシは HTTP 407 を返し、次のような応答が返されました:

Authentication error. Please check your authentication settings.

PuppeteerにおけるIPローテーションとスティッキーセッション

リクエストで同じIPを維持する必要がない場合は、IPローテーションを使用してください。

今回のテストでは、HTTPポートローテーションを有効にしてPuppeteerを起動しました:

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://proxy.geonode.io:9000"],
});

const page = await browser.newPage();

await page.authenticate({
  username: process.env.GEONODE_PROXY_USER,
  password: process.env.GEONODE_PROXY_PASS,
});

新しいブラウザセッションを使用して5件のリクエストを送信しました:

Request 1: 108.31.182.167
Request 2: 45.186.93.125
Request 3: 109.254.131.42
Request 4: 109.153.11.141
Request 5: 37.113.173.139

ユニークなIP数:5

IPローテーション:有効

このテストでは、5件のリクエストすべてで異なるIPが返されました。これは実行中にローテーションが機能したことを確認するものではありますが、今後のリクエストごとに新しいIPが保証されるわけではありません。

関連するリクエストを同じIPで維持する必要がある場合は、代わりにスティッキーセッションを使用してください。スティッキーポートを使用し、セッションの詳細をユーザー名に追加します:

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://proxy.geonode.io:10000"],
});

const page = await browser.newPage();

await page.authenticate({
  username:
    `${process.env.GEONODE_PROXY_USER}-session-blogpuppeteer01-lifetime-10`,
  password: process.env.GEONODE_PROXY_PASS,
});

同じセッションを使用して3件のリクエストを実行しました:

Request 1: 178.64.64.40
Request 2: 178.64.64.40
Request 3: 178.64.64.40

同一IP:はい

3件のリクエストすべてで同じIPが使用されました。

利用可能な設定については、Geonode

のガイドにあるプロキシのローテーションおよびスティッキーセッションを参照してください。

Puppeteerでよく発生するプロキシエラーとその解決方法

プロキシが機能していない場合は、まず接続情報を確認しましょう。ユーザー名とパスワードを確認した後、ホスト、ポート、プロトコルを確認してください。Puppeteerから返されるエラーメッセージは、通常、問題の原因を絞り込むのに役立ちます。

407 プロキシ認証が必要

407 エラーは通常、認証に関する問題を示しています。

Puppeteer で間違ったパスワードを使用してテストしたところ、プロキシから次のような応答が返されました:

HTTP status: 407
Authentication error. Please check your authentication settings.

まず、ユーザー名とパスワードを確認してください。それらが正しい場合は、ページの作成後に page.authenticate() が呼び出されていることを確認してください。

ERR_TUNNEL_CONNECTION_FAILED / 接続が拒否されました

接続エラーは通常、Puppeteerがプロキシに接続できなかったことを意味します。

まず、ホスト名とポート番号を確認してください。次に、プロトコルが使用中のプロキシサーバーと一致していることを確認してください。

接続失敗のテストでは、PuppeteerはERR_TUNNEL_CONNECTION_FAILED

を返さなかった。接続できないプロキシポートを使用した場合、

net::ERR_CONNECTION_RESET at http://ip-api.com/json

が返された。したがって、接続がどのように失敗するかによって、Chromiumのエラーメッセージは異なる場合がある。

タイムアウトと空のレスポンス

タイムアウトとは、設定された時間内にページがレスポンスを受け取れなかったことを意味します。

まず、ターゲットURLが正常に動作するか、およびプロキシに接続できるかを確認してください。両方が正常に動作している場合は、page.goto()

に渡されたタイムアウト値を確認してください。

今回のテストでは、タイムアウトを5秒に設定したルーティング不可のプロキシを使用しました:

await page.goto(url, {
  timeout: 5000,
});

。Puppeteerは次のように返しました:

TimeoutError: Navigation timeout of 5000 ms exceeded

。明示的なタイムアウトを設定することで、プロキシ接続がハングした際にスクリプトが速やかに失敗するようになります。

ERR_NO_SUPPORTED_PROXIES

Puppeteer特有の問題として、--proxy-server

内にユーザー名とパスワードを直接記述していたことが判明しました。

この設定では失敗しました:

--proxy-server=http://USERNAME:PASSWORD@proxy.geonode.io:9000

Puppeteerからの応答:

net::ERR_NO_SUPPORTED_PROXIES

修正方法は、起動引数を通じてプロキシサーバーのみを渡すことです:

args: ["--proxy-server=http://proxy.geonode.io:9000"]

その後、別途認証を行います:

await page.authenticate({
  username: process.env.GEONODE_PROXY_USER,
  password: process.env.GEONODE_PROXY_PASS,
});

設定を変更した後、リクエストはHTTP 200で成功しました。

Puppeteer + Geonode:得られるメリット

Puppeteerは、アプリケーション内のリクエストや接続を処理します。Geonodeは、プロキシ接続を処理します。

ジョブに応じて、一般家庭用、ISP、データセンターのプロキシを選択でき、必要に応じてローテーション、スティッキーセッション、ジオターゲティングを利用できます。これにより、プロキシの設定をアプリケーションの他のコードから分離できます。

プランはプロキシの種類によって異なり、GB単位で課金されるオプションもあります。

よくある質問

PuppeteerはSOCKS5プロキシに対応していますか?

テストしたPuppeteerの設定では、認証が必要なSOCKS5は機能しませんでした。

GeonodeのSOCKS5(ポートローテーション)をpage.authenticate()で試しましたが、Puppeteerからは次のようなエラーが返されました:

net::ERR_SOCKS_CONNECTION_FAILED

また、--proxy-serverに認証情報を埋め込んで試しましたが、次のようなエラーが返されました:

net::ERR_NO_SUPPORTED_PROXIES

テストした認証が必要なSOCKS5の設定はいずれも機能しなかったため、この構成では、--proxy-serverおよびpage.authenticate()を使用した検証済みのHTTP設定の方が安全な選択肢となります。

PuppeteerでリクエストごとにIPをローテーションすることはできますか?

はい、Puppeteerでは、ローテーションプロキシの設定を通じてブラウザを起動する場合、ローテーションプロキシを使用することができます。

当社のテストでは、5つの新しいブラウザセッションで5つの異なるIPアドレスが返されました。これはテスト中にIPアドレスのローテーションが行われたことを裏付けていますが、すべてのリクエストやブラウザセッションで異なるIPアドレスが保証されるわけではありません。

無料トライアルはありますか?

はい。Geonodeでは無料トライアルを提供しているため、有料プランに移行する前にPuppeteerを使ってプロキシを試用することができます。現在の無料トライアルとプランを確認する。

Puppeteerでプロキシはどこで設定すればよいですか?

puppeteer.launch()

内の ``--proxy-server`

` を使用して、プロキシのホスト名とポートを設定してください。

その後、各ページを作成した後に ``page.authenticate()`

` を呼び出し、ユーザー名とパスワードを指定してください:

const browser = await puppeteer.launch({
  args: ["--proxy-server=http://proxy.geonode.io:9000"],
});

const page = await browser.newPage();

await page.authenticate({
  username: process.env.GEONODE_PROXY_USER,
  password: process.env.GEONODE_PROXY_PASS,
});

これは、当社のテストで動作した設定です。

プロキシのユーザー名とパスワードを --proxy-server に指定すべきですか?

いいえ。この Puppeteer の設定を使用する場合は、認証情報を別々に管理してください。

--proxy-server に USERNAME:PASSWORD@ を直接埋め込んだところ、テストでは「ERR_NO_SUPPORTED_PROXIES」というエラーが返されました。そこにホストとポートのみを指定し、認証情報には page.authenticate() を使用すると、正常に動作しました。