このAxiosプロキシガイドでは、以下のトピックを取り上げます。
- Axiosでプロキシを使うべき理由とは。
- AxiosでHTTP、HTTPS、SOCKSプロキシを設定する方法。
- 認証情報とプロキシのローテーションを実装する方法。
Axiosとは何か、なぜプロキシが必要なのか?
AxiosとはJavaScriptエコシステムで最もよく使われているHTTPクライアントの1つです。Promiseベースの使いやすく直感的なAPIで、HTTPリクエストを実行したり、カスタムヘッダー、設定、クッキーなどを処理したりする機能が備わっています。
Axiosにプロキシが必要な理由とは理由はとても簡単です。リクエストをプロキシ経由でルーティングすることで、本来のIPアドレスを隠すことができるため、目的のサーバーがユーザーを識別してブロックするのがより困難になるからです。こうしたプライバシー対策を追加することで、アプリケーションの整合性を維持しながら、IPのアクセス禁止措置や制限を回避しやすくなります。node-fetchプロキシガイドで説明されているように、Fetch でも同じ結果が得られます。
Axiosでプロキシを使用する
このAxiosとプロキシの解説記事ではAxiosでHTTP、HTTPS、SOCKSプロキシを設定する方法を説明します。
前提条件
はじめに、npmのaxios
パッケージがインストールされていることを確認してください。次のコードでAxiosをプロジェクトの依存関係に追加します。
npm install axios
Node.jsでAxiosを使用している場合、proxy
configにてHTTPプロキシとHTTPSプロキシがネイティブにサポートされています。そのため、Node.jsアプリケーションでAxiosでHTTP/HTTPSプロキシを使う場合は何の準備も必要ありません。
HTTP/HTTPS以外のプロキシを使用したい場合は、 Proxy Agentsプロジェクトを利用する必要があります。Proxy AgentsにはHttp.Agentが実装されており、それを使えばAxiosをさまざまなプロトコルのプロキシと統合できるようになります。Proxy Agentsプロジェクトは、使用プロトコル別の様々なライブラリをnpmで公開しています。
- HTTPプロキシとHTTPSプロキシ:
https-proxy-agent
- SOCKS、SOCKS5,、SOCKS4:
socks-proxy-ag
ent
- PAC-*:pac-proxy-agent
素晴らしいです!これでAxiosでプロキシを設定する準備ができました!
HTTP/HTTPSプロキシ
お使いのHTTP/HTTPSプロキシのURLは次のようになるはずです。
"<PROXY_PROTOCOL>://<PROXY_HOST>:<PROXY_PORT>"
ここでは次のアドレスを自分のHTTPプロキシのURLと考えてください。
"http://47.88.62.42:80"
Axiosではこのプロキシを次のように設定できます。
axios.get(targetURL, {
proxy: {
protocol: "http",
host: "48.88.62.42",
port: "80"
}
})
ご覧のとおり、プロキシURLを2つに分割し、それをプロキシ設定で正しく指定することがポイントとなります。これでAxiosから指定されたHTTPプロキシサーバーを介し、パラメーターとして渡されたURLにリクエストを送信できるようになります。
上記のAxiosでプロキシを利用する方法が機能するかどうかを確認してみましょう!
HTTPまたはHTTPSのプロキシサーバーのURLはオンラインで無料で取得できます。たとえば、こちらを見てください。
Protocol: HTTP; IP Address: 52.117.157.155; Port: 8002
完全なプロキシURLは「http://52.117.157.155:8002」になります。
プロキシが期待どおりに動作するかどうかを確認するために、HttpBinプロジェクトの/ipエンドポイントにリクエストを送ってみましょう。このパブリックAPIはリクエストの発信元のIPを返します。つまり、プロキシを使っている場合は、プロキシサーバーのIPを返すはずです。
Node.jsスクリプトのスニペットは次のようになります。
import axios from "axios"
async function testProxy() {
// perform the desired request through the HTTP proxy
const response = axios.get("https://httpbin.io/ip", {
proxy: {
protocol: "http",
host: "52.117.157.155",
port: "8002"
}
})
// print the result
console.log(response.data)
}
testProxy()
スクリプトを実行すると、次の文字列が表示されるはずです。
{ "origin": "52.117.157.155" }
これはプロキシサーバーのIPです。つまり、プロキシサーバーが期待どおりに動作しており、自分のIPは秘匿されているということになります。
残念ながら、あなたがスクリプトを実行しても同じ結果は得られません。エラーで終了してしまいます。なぜでしょう?これは無料プロキシの存続期間が短く、さらに信頼性が低いからです。無料のプロキシは学習に役立ちますが、実際の業務などで使うべきではありません。
注意: 無料のプロキシは信頼性が低く、低速で、エラーが発生しやすく、データを大量に消費し、長持ちしません。そのため、なるべく使わないようにしましょう。
では何を使えば良いのでしょうか。業界大手のプロバイダーであるBright Dataのプレミアムプロキシをお勧めします。登録して、信頼性の高いプロキシを無料でお試しください。
SOCKSプロキシ
proxy configオブジェクトのプロトコルフィールドに「socks」という文字列を設定すると、次のエラーが表示されます。
AssertionError [ERR_ASSERTION]: protocol mismatch
// ...
{
generatedMessage: false,
code: 'ERR_ASSERTION',
actual: 'dada:',
expected: 'http:',
operator: '=='
}
このエラーはAxiosがSOCKSプロキシをネイティブにサポートしていないために発生します。したがって、目的の結果を得るには追加のライブラリが必要です。
以下のコマンドを使用して、npmのsocks-pr
oxy-agent
ライブラリをプロジェクトの依存関係に追加します。
npm install socks-proxy-agent
このパッケージを使用すると、AxiosでHTTPまたはHTTPSリクエストを送信する際にSOCKSプロキシサーバーに接続できるようになります。
次に、ライブラリからSOCKS proxy agentをインポートします。
const SocksProxyAgent = require("socks-proxy-agent")
ESMの場合はこちらのコードを使用します。
import { SocksProxyAgent } from "socks-proxy-agent"
ここでは次のURLをあなたのSOCKSプロキシのURLと考えてください。
"socks://183.88.74.73:4153"
プロキシのプロトコルには「socks」、「socks5」、「socks4」のいずれかの値を指定できます。
変数に保存し、 SocksProxyAgent
のコンストラクタに渡します。
const proxyURL = "socks://183.88.74.73:4153"
const proxyAgent = new SocksProxyAgent(proxyURL)
SocksProxyAgent ()
はhttp.Agent
のインスタンスをイニシャライズし、プロキシURLを介してHTTPおよびHTTPSリクエストを実行します。
これで、以下のようにAxiosでSOCKSプロキシを使用できるようになりました。
axios.get(targetURL, {
httpAgent: proxyAgent,
httpsAgent: proxyAgent
})
httpAgentとhttpsAgentは、それぞれHTTPリクエストおよびHTTPSリクエストを送るときに使用するカスタムエージェントの定義に使います。つまり、これらを使えばAxiosが送るHTTPまたはHTTPSリクエストが指定されたSOCKSプロキシを経由するようになるのです。Axiosとnpmのhttps-proxy-agent
パッケージを併用することでも、HTTP/HTTPSプロキシを設定できます。
それでは全てをまとめてみましょう。
import axios from "axios"
import { SocksProxyAgent } from "socks-proxy-agent"
async function testProxy() {
// replace with the URL of your SOCKS proxy
const proxyURL = "socks://183.88.74.73:4153"
// define the HTTP/HTTPS proxy agent
const proxyAgent = new SocksProxyAgent(proxyURL)
// perform the request via the SOCKS proxy
const response = await axios.get("https://httpbin.io/ip", {
httpAgent: proxyAgent,
httpsAgent: proxyAgent
})
// print the result
console.log(response.data) // { "origin": "183.88.74.73" }
}
testProxy()
AxiosでのSOCKSプロキシ設定のその他の例については、こちらのリンクからご確認ください。
Axiosプロキシ:高度なユースケース
Axiosでプロキシを使う方法の基本を理解したところで、次はもっと複雑な手法を掘り下げてみましょう。
プロキシをグローバルに設定する
プロキシをAxiosインスタンスで直接指定することで、グローバルに設定できます。
const axiosInstance = axios.create({
proxy: {
protocol: "<PROXY_PROTOCOL>",
host: "<PROXY_HOST>",
port: "<PROXY_PORT>"
},
// other configs...
})
Proxy Agentsを使用する場合こちらです。
// proxy Agent definition ...
const axiosInstance = axios.create({
httpAgent: proxyAgent,
httpsAgent: proxyAgent
})
これでAxiosInstance
から送られたリクエストは全て、指定されたプロキシを自動的に経由するようになります。
Axiosでのプロキシ認証処理
プレミアムプロキシへのアクセスを有料ユーザーのみに限定するため、プロキシプロバイダーは認証を導入してプロキシを保護しています。認証情報なしで保護されたプロキシに接続しようとすると、「407 プロキシ認証が必要です」というエラーが表示されます。
保護されたプロキシのURLを使う場合のシンタックスは次のとおりです。
[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]
保護されたプロキシに接続するためのURLは、具体的には次のようになります。
http://admin:[email protected]:8391
この場合、プロキシURLは次のようになります。
- <
PROTOCOL>
:HTTP
<HOST>
:156.127.0.192
<PORT>
:8391
<USERNAME>
:admin
<PASSWORD>
:lK4w90MEe45YIkOpk
Axiosでプロキシ認証を処理するには、proxy
のauth
フィールドにユーザー名とパスワードを指定するだけ済みます。
axios.get(targetURL, {
proxy: {
protocol: "http",
host: "156.127.0.192",
port: "8381",
auth: {
username: "admin",
password: "lK4w90MEe45YIkOpk"
}
}
})
お見事です!簡単ですね!
Proxy Agentsをお使いの場合、次の2つの方法で認証情報を指定できます。
- プロキシURLで認証情報を直接指定する。
var proxyAgent = new SocksProxyAgent("http://admin:[email protected]:8391")
URL
オブジェクトにusername
とpasswordのオプションを設定する。
const proxyOpts = new URL("http://156.127.0.192:8391")
proxyOpts.username = "admin"
proxyOpts.password = "lK4w90MEe45YIkOpk"
const proxyAgent = new SocksProxyAgent(proxyOpts)
HttpsProxyAgentでも同様のアプローチが使えます。
環境変数でプロキシを設定する
もう一つの方法としては、次の環境変数を設定することで、Axiosでグローバルにプロキシを使用できるようになります。
HTTP_PROXY
:HTTPリクエストに使用するプロキシサーバーのURL。HTTPS_PROXY
:HTTPSリクエストに使用するプロキシサーバーのURL。
LinuxやmacOSでは次のようなコマンドを使用して設定します。
export HTTP_PROXY = "[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"
export HTTPS_PROXY = "[<PROTOCOL>://]<USERNAME>:<PASSWORD>@<HOST>[:<PORT>]"
Axiosがこれらの環境変数を検出すると、認証情報を含むプロキシ設定を環境変数から読み取ります。Axiosがこれらの環境変数を無視するようにするには、proxy
フィールドをfalse
に設定してください。NO_PROXY
envを作成し、プロキシを使用しないドメインを指定することもできます。このenvファイルはコンマ区切りのリストとして定義します。
ちなみにcURLでプロキシを使用する場合も、同じメカニズムが使えます。
ローテーションプロキシの実装
同じプロキシサーバーを何度も使用していると、目的のサイトにプロキシのIPアドレスをブロックされてしまうことがあります。これを防ぐためには、各リクエストが別々のプロキシサーバーから送信されていることを確認しておかなければなりません。この機能を実装するためには以下のようなアプローチを取ります。
- まずオブジェクトのリストを定義します。各オブジェクトには、それぞれに異なるプロキシに接続するための情報が含まれています。
- リクエストを送信する前にプロキシオブジェクトをランダムに選択します。
- Axiosで選択したプロキシを使用します。
上記のアプローチは、信頼できるプロキシサーバーのプールにアクセスできることを前提としています。しかし、たくさんのサーバーへのアクセス権を取得すると、費用がかさんでしまう可能性があります。さらに、そのロジックをコードに落とし込むのは面倒な退屈な作業になるかもしれません。
ここで役に立つのがBright Dataです。Bright Dataは自動的にIPアドレスを切り替えるローテーションプロキシを提供しています。接続するたびに、新しいIPアドレスのプロキシにアクセスできます。これらのプロキシサーバーは195か国でアクセス可能で、優れたネットワーク稼働率を誇り、99.9%のアクセス成功率が保証されています。Bright Dataのローテーションプロキシをぜひお試しください!
まとめ
このAxiosプロキシチュートリアルでは、Axiosでプロキシを使う理由とその方法を学びました。読み終わった方は、AxiosでHTTP/HTTPS/SOCKSプロキシの設定する方法を理解いただけたと思います。ご覧いただたように、必要なコードは数行だけです。
また、無料のプロキシサービスを使用すべきではないことも理解いただけたと思います。そこで、どのプロキシプロバイダーを選ぶかということが問題となります。プロキシ業界大手のBright Dataを選べば、選ぶ時間も手間も省けます。
Bright Dataは世界最高水準のプロキシサーバーを管理しており、フォーチュン500企業を含む2万社以上のお客様にサービスを提供しています。世界中に広がるプロキシネットワークで、以下のようなプロキシを提供しています。
- データセンタープロキシ — 77万個以上のデータセンターIP。
- 住宅用プロキシ — 195か国以上で7,200万個を超える住宅用IP。
- ISPプロキシ — 70万個以上のISP用IP。
- モバイルプロキシ — 700万個以上のモバイル用IP。
Bright Dataは総合的に見て、世界で最大かつ最も信頼性の高いプロキシネットワークの1つです。弊社の営業担当者にご相談の上、お客様のニーズに合ったBright Data製品をお選びください。
クレジットカードは必要ありません