Node.js は、サーバーサイドやネットワークアプリケーションを作成できる人気のJavaScriptランタイム環境です。たとえば、Node.jsでリモートAPIやウェブサイトからデータを取得する必要がある場合、アプリケーションとインターネットの間の仲介役として機能するウェブプロキシサーバーを使用できます。これにより、ネットワーク制限を回避し、地域制限のあるコンテンツにアクセスし、IPアドレスを隠すことができます。
最近のJavaScriptアプリのほとんどは、 HTTPリクエストを行うためにFetch API を使用しています。これはウェブブラウザに組み込み機能として用意されており、Node.js v16以降では外部依存関係なしで利用できます。ただし、1つ注意点があります。Node.jsの組み込みfetch機能はウェブブラウザで利用可能なものを反映しており、プロキシと連携して動作しません。
幸いなことに、簡単な解決策があります。それが node-fetch ライブラリです。このライブラリにはNode.js用のFetch APIが含まれており、Node.js HTTPエージェントと連携できるなど、Node.js固有の機能が追加されています。HTTPエージェントとは、コネクションプーリングを管理するツールであり、HTTPリクエストのための接続を再利用できるようにします。つまり、HTTPエージェントを使ってプロキシ経由でフェッチリクエストを設定できるということです。
この記事では、 node-fetch を https-proxy-agent ライブラリと共に使用して、HTTPとHTTPSの両方のプロキシに対応するHTTPエージェントを作成する方法を学びます。また、ウェブスクレイピングのニーズに応じたさまざまなプロキシタイプと機能を提供する、Bright Data のプロキシサービスについても学びます。
node-fetchでプロキシを使用する方法
このチュートリアルを始める前に、以下の前提条件が必要です。
- Node.jsの動作するインストール環境。
- ウェブプロキシへのアクセス。あるいは、テスト目的であれば、Node.jsを使って独自のウェブプロキシをセットアップすることもできます。
これらの前提条件が揃ったら、さっそく始めましょう!
Node.jsプロジェクトを作成する
まず最初に行うべきことは、Node.jsプロジェクトを作成し、 npm で初期化することです。これを行うには、ターミナルを開いて以下のコマンドを実行します。
mkdir node-fetch-proxy
cd node-fetch-proxy
npm init -y
このコマンドは node-fetch-proxy というフォルダを作成し、その中に移動して、デフォルト値を含む package.json ファイルを作成します。
node-fetchとhttps-proxy-agentをインストールする
次に、以下のコマンドを使って、プロジェクトの依存関係として node-fetch と https-proxy-agent ライブラリをインストールする必要があります。
npm install –-save node-fetch https-proxy-agent
このコマンドは、プロジェクトの node_modules フォルダにライブラリをインストールし、それに応じて package.json ファイルを更新します。
HttpsProxyAgentとnode-fetchを使ってプロキシ経由でHTTP呼び出しを行う
node-fetch と https-proxy-agent ライブラリをインストールしたら、 https-proxy-agent ライブラリの HttpsProxyAgent クラスと、 node-fetch ライブラリの fetch 関数を使って、プロキシ経由でHTTP呼び出しを行う必要があります。これを行うには、プロジェクトフォルダに proxy.mjs というファイルを作成し、以下のコードを追加します。
import fetch from 'node-fetch';
import { HttpsProxyAgent } from 'https-proxy-agent';
// <proxy_url>を実際のプロキシURLに置き換えてください
const agent = new HttpsProxyAgent('<proxy_url>');
// agentオプションを使ってfetchでプロキシ経由のHTTPリクエストを行う
// <target_url>をリクエストしたいURLに置き換えてください
fetch('<target_url>', { agent })
.then((response) => response.text())
.then((text) => console.log(text))
.catch((error) => console.error(error));
このコードは以下の処理を行います。
- Node.js用のブラウザ互換のFetch APIを提供する、
node-fetchライブラリからfetch関数をインポートします。 - HTTPSプロキシに対応するHTTPエージェントを作成する、
https-proxy-agentライブラリからHttpsProxyAgentクラスをインポートします。 - プロキシURLを使って
HttpsProxyAgentインスタンスを作成します。<proxy_url>は実際のプロキシURLに置き換える必要があり、形式は以下のようになります。http://username:password@host:port。 - agentオプションを使って
fetch関数を利用し、プロキシ経由でHTTPリクエストを行います。<target_url>をリクエストしたいURLに置き換える必要があり、有効なHTTPまたはHTTPSのURLであれば何でも構いません。 - レスポンスを処理し、発生したエラーを出力します。
コードを保存し、以下のコマンドを実行します。
node proxy.mjs
このコマンドはコードを実行し、プロキシ経由でHTTPリクエストを行います。ターミナルにレスポンステキストまたはエラーが表示されるはずです。
node-fetchでプロキシを使用する際の制限事項
このアプローチは単純なプロキシを使用する場合にはうまく機能しますが、ウェブスクレイピングなど、多くの実際のユースケースではより高度なアプローチが必要になります。多くのウェブサイトやウェブAPIは、よく知られたプロキシのIPアドレスをブロックするため、必要なデータの収集が困難になります。
さらに、サイトによっては訪問者の所在地に基づいてコンテンツを非表示にする地理的制限がある場合があります。たとえば、一部の米国の新聞社は、一般データ保護規則(GDPR)やePrivacy指令への準拠が難しいという理由から、ヨーロッパの訪問者を自社サイトからブロックしています。
幸いなことに、Bright Dataプロキシサービスが提供するようなより高度なプロキシは、こうした制限を回避できるいくつかの種類のプロキシを提供しています。
Bright Dataプロキシサービス
ウェブスクレイピング向けに信頼性が高くスケーラブルなプロキシサービスをお探しなら、これ以上探す必要はありません。 Bright Data はプロキシソリューションの大手プロバイダーであり、195カ国に400M+ monthlyのIPアドレスを提供し、99.9パーセントの稼働率を誇ります。
Bright Dataのプロキシサーバーでは、用途や予算に応じて、レジデンシャル、データセンター、インターネットサービスプロバイダー(ISP)、モバイル、スーパープロキシなど、さまざまな種類のプロキシから選択できます。この豊富な選択肢は、既知のプロキシIPアドレスをブロックするサイトからコンテンツを取得する必要があるウェブスクレイパーを作成する際に役立ちます。
自分で制御できない場所で動作する汎用プロキシに頼る代わりに、Bright Dataプロキシを使えば、スクレイピング対象のコンテンツに通常アクセスするユーザーのタイプに最も合ったプロキシの種類を選択できます。また、ジオターゲティング、IPローテーション、セッションコントロールなどの高度な機能にもアクセスでき、アプリケーションがブロックされないようにすることができます。
Bright Dataのプロキシタイプ
Bright Dataは、さまざまなウェブスクレイピングのシナリオに応じて異なる種類のプロキシを提供しています。以下は、Bright Dataが提供するプロキシの一部です。
- レジデンシャルプロキシ は、個人のコンピュータやノートパソコンのような、住宅用ISPを通じてインターネットに接続されている本物のデバイスを経由してインターネットクエリをルーティングします。これらのプロキシは、一般ユーザーに紛れ込むため、プロキシ経由のリクエストがブロックされる可能性を減らすことができ、ウェブスクレイピング活動において優れた性能を発揮します。
- プロキシサーバー はゲートウェイとして機能し、Bright Dataの広範なレジデンシャルプロキシのネットワークへのアクセスを提供します。単一のスーパープロキシURLを使用することで、特定のIPアドレスを指定することなく、任意のレジデンシャルプロキシに接続できます。さらに、スーパープロキシでは、使用したいレジデンシャルプロキシの国、都市、ISP、またはASNの選択を含む、複数の設定を細かく調整できる柔軟性があります。
- データセンター・プロキシ は、データセンター施設内に設置されたサーバーに割り当てられたIPアドレスを使用します。データセンター・プロキシはウェブサイトやAPIによる検出とその後のブロックを受けやすい傾向がありますが、プロキシリクエストをブロックしようとしないURLからデータにアクセスするアプリには依然として有用です。これらは、スクレイピングトラフィックがレジデンシャル、ビジネス、またはモバイルのIPアドレスから発信される必要のないウェブスクレイピングプロジェクトに最も適しています。
- ISPプロキシ は、ISPによってホストされているサーバーに割り当てられたIPアドレスです。ISPプロキシはレジデンシャルプロキシと似ていますが、そのIPアドレスがレジデンシャルまたはビジネスIPのいずれかである可能性があるという違いがあります。これにより、レジデンシャルとビジネスのトラフィックが混在することを想定したサイトをスクレイピングする際に適しています。
プロキシマネージャーとAPI
選択肢が非常に多いため、プロキシの利用管理が複雑になることがあります。幸いなことに、Bright Dataの プロキシマネージャー を使えば、プロキシの設定と管理、使用状況とパフォーマンスの監視、問題のトラブルシューティングを簡単に行うことができます。
さらに、Bright DataのAPIと統合機能を使用して、プロキシをコードにシームレスに組み込むことができます。 スクレイピングブラウザAPI は、おそらく馴染みのあるツール(例えば Playwright や Puppeteer)からプロキシを簡単に使用できるようにし、 Web Unlocker は、通常スクレイパーがサイトにアクセスするのを妨げるブロックを克服するのに役立ちます。
まとめ
この記事では、 node-fetch ライブラリを https-proxy-agent ライブラリと共に使用して、HTTPSプロキシに対応するHTTPエージェントを作成する方法を学びました。また、ウェブスクレイピングのニーズに応じたさまざまなプロキシタイプと機能を提供するBright Dataプロキシサービスについても学びました。
Node.jsのfetchリクエストでウェブプロキシを使用することで、ネットワーク制限を回避し、地域制限のあるコンテンツにアクセスし、IPアドレスを隠すことができます。ただし、 node-fetch と https-proxy-agent を使った単純なプロキシ化では、匿名性、ジオターゲティング、IPローテーション、その他の高度な機能が必要な場合など、一部のウェブスクレイピングのシナリオでは不十分な場合があります。そのような場合は、代わりにBright Dataプロキシの使用を検討すべきです。
Bright Dataのプロキシサービスは、ブロックやスロットリングを受けることなく、あらゆるウェブサイトやAPIにアクセスできるよう支援する幅広い機能を提供しています。また、用途や予算に応じて、さまざまな種類のプロキシから選択することもできます。Bright Dataのプロキシサービスを使い始めるには、今すぐサインアップしてください。