cURLでプロキシを使用する

cURLでプロキシをすぐに使えるよう、このガイドにはコードスニペットも含まれています。
3 min read
Using proxies with cURL featured image

この記事では説明すること:

cURLとは

cURLは「Client URL」の略で、URLを使用してインターネット上でデータを送受信するためのツールです。ソフトウェアとしては、ライブラリ(libcurl)とコマンドラインツール (curl) の両方が提供されています。この記事では、URLシンタックスを使ってデータを転送するためのコマンドラインツール、curlに焦点を当てます。 

curlはHTTP、HTTPS、FTP、FTPS、SFTP、POP3、POP3、POP3S、IMAP、IMAPS、LDAP、LDAPS、SCPなどを含む幅広いプロトコルをサポートしています。そのため、 curl は世界で最も人気があり、広く使用されているコマンドライン型HTTPクライアントとなっています。 

cURLは非常に汎用性が高く、HTTPリクエストの作成、ファイルのダウンロード、データのアップロード、APIとのやり取りなど、さまざまなタスクを実行できる汎用ソリューションです。cURLにはリクエストのカスタマイズやプロキシサポートなど、様々な機能が備わっています。

curlのインストール

コンピューターにcurlをインストールする方法を学びましょう。

macOS

macOSの場合、curlをインストールする必要はありません。curlが既にオペレーティングシステムに含まれているため、ターミナルからそのまま使用できます。

Windows

Windows 10以降のWindowsにはcurlが付属しています。しかし、それと同時にcurl コマンドはPowerShellのInvoke-WebRequestコマンドのエイリアスとなっています。つまり、Windowsターミナルのcurlコマンドは、バックグラウンドでInvoke-Requestを呼び出すことになります。これを回避して実際にcURLのcurl を使用するには、「curl」を「curl.exe」に置き換えてください。そうすることで、PowerShellはInvoke-Requestを使用せずに、curlを実行するようになります。

例:ターミナルで次のコマンドを実行すると、Windowsコンピューターに現在インストールされているcurlのバージョンを確認できます。

curl.exe --version

実行後、次のような内容が表示されます。

curl 8.0.1 (Windows) libcurl/8.0.1 Schannel WinIDN

Release-Date: 2023-03-20

Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp

Features: AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets

Windowsをお使いの場合、記事内のコマンドにあるすべての「curl」インスタンスを「curl.exe」文字列に書き換えてください。インスタンスを書き換えたくない方は、Linux用Windowsサブシステム(WSL)をセットアップし、以下の手順に従ってください。

Linux

Linuxでcurlをインストールする手順は、使用しているディストリビューションによって異なります。UbuntuやFedoraなどの人気のあるLinuxディストリビューションには、curlがデフォルトで付属しています。そのため、 curlをターミナルでそのまま使用できます。

その他のディストリビューションには、curlが含まれない場合があります。その場合も、ディストリビューションパッケージマネージャーを使用して追加できます。DebianベースのOSでは、次のコマンドでcurlをインストールできます。

sudo apt-get install curl

curlでプロキシを使用するために必要なもの

プロキシはクライアントと送信先サーバーの間の仲介役として機能します。クライアントからのリクエストを受け取り、それをサーバーに転送し、サーバーからレスポンスを受信し、受信した内容をクライアントに返します。この仲介者としてのアプローチにより、匿名性を高めたり、ネットワーク制限を回避しやすくしたりできます。これはリクエストがクライアントからではなく、指定したプロキシサーバーのIPと場所からのものであると送信先のサーバーが認識するためです。

curlでプロキシサービスを使用するには、まずプロキシにアクセスする必要があります。具体的には、プロキシURLのシンタックスは次のとおりです。

[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]

詳細は次のとおりです。

  • <PROTOCOL>:プロキシサーバーへの接続に使用するプロトコル。プロトコルが指定されていない場合、curlはデフォルトでhttp://を使用します。
  • <HOST>:プロキシサーバーのホスト名のIPアドレスまたはURL。
  • <PORT>:プロキシサーバーの待ち受けポート番号。ポートが指定されていない場合、curlはデフォルトで1080を使用します。
  • <USERNAME>:認証が必要な場合に指定するユーザー名(任意)。
  • <PASSWORD>:認証が必要な場合に指定するパスワード(任意)。

プロキシプロトコルに関しては、HTTP、HTTPS、SOCKSが最も一般的です。

それでは有効なHTTPプロキシを取得しましょう!

以下の手順に従うことで、Free Proxy Listで無料のプロキシを入手できます。

IP Address: 71.19.249.97; Port: 8443

これはプロキシURLが次のものであることを示しています。

http://71.19.249.97:8443

実際の業務などでは無料のプロキシを信頼すべきではありませんが、学習目的で使用する分には問題ありません。無料のプロキシは信頼性が低く、エラーが発生しやすく、さらに低速で、データを大量に消費し、長持ちしません。そのため、本来は使用すべきではないのです。

では何を使えば良いのでしょうか?大手プロバイダーであるBright Dataのプレミアムプロキシをお勧めします。登録して、信頼性の高いプロキシを無料でお試しください。

プレミアムソリューションは認証によって保護されています。プロトコルがHTTP、ホストが71.103.203.109、ポートが9321、認証情報の組み合わせがadmin-32458rTuJ3tEwfであるとします。この場合、curlのプロキシURLは次のようになります。

http://admin-32458:@rTuJ3tEwf71.103.203.109:9321

curlでHTTP/HTTPSプロキシを指定する方法

始める前に、ターミナルで以下のコマンドを実行します。

curl "https://httpbin.org/ip"

ご覧のとおり、基本的なcurlシンタックスは次のとおりです。

curl [optional_commands] <URL>

curlのベストプラクティスでは、特殊文字関連の問題を避けるためにURLを二重引用符(””)で囲むことを推奨しています。

実行すると、次のような結果が得られるはずです。

{

  "origin": "194.33.243.7"

}

HttpBinを使えば、HTTPリクエストに関する情報を取得できます。例えば/ipエンドポイントにリクエストを送ると、送信元のIPアドレスが返ってきます。送信元のIPアドレスとはリクエストを実行したコンピューターのIPアドレスのことです。つまり、使用中のコンピューターのIPを返してくれるのです。 

curlでプロキシを設定すると、自分のIPアドレスではなく、プロキシサーバーのIPアドレスが表示されるはずです。

curlでプロキシの設定をする方法はいくつかあります。それでは、curlでHTTP/HTTPSプロキシを指定するための最も一般的な方法をご紹介します。

コマンドライン引数の使用

curlには、プロキシURLを設定するためのコマンドライン引数が2つ用意されています。

  • -x
  • --proxy

この2つはまったく同じ働きをするため、どちらを使用しても構いません。後者は前者のエイリアスです。

したがって、curlでプロキシサービスを使用する場合のシンタックスは次のようになります。

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

または、

curl --proxy [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

注意curlのオプションでは大文字と小文字が区別されます。たとえば、-x-Xの意味は異なり、2つの別々のコマンドになります。

次のコマンドを実行する。

curl -x "http://71.19.249.97:8443" "https://httpbin.org/ip"

またはそれと同等のコマンド。

curl --proxy "http://71.19.249.97:8443" "https://httpbin.org/ip"

結果:

{

  "origin": "71.19.249.97"

}

送信元がプロキシサーバーのIPと一致しています。これは目標通り、目的のサイトがリクエストをプロキシからのものとして認識していることを示します。お見事です!

無料のプロキシは存続期間が短いため、この記事を読み終わる前に上記のサーバーが停止してしまっている可能性が高いことに注意してください。エラーが発生した場合は、新しいプロキシに切り換えてください。

環境変数の使用

次の2つの環境変数を設定することでも、curlでプロキシを使用できるようになります。

  • http_proxy:HTTPプロトコルを使ってURLへのアクセスするのに使用するプロキシサーバーのURL。
  • https_proxy:HTTPSプロトコルを使ってURLへのアクセスするのに使用するプロキシサーバーのURL。

macOSとLinuxでは、以下のシンタックスでこれら2つの環境を設定できます。

export http_proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

export https_proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

つまり、その2つのコマンドとは次のようなものになります。

export http_proxy="http://71.19.249.97:8443"

export https_proxy="http://71.19.249.97:8443"

Windowsでは、次のPowerShellシンタックスを使ってください。

$env:http_proxy = "[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

$env:https_proxy = "[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

その後、この例では次の通りになります。

$env:http_proxy = "http://71.19.249.97:8443"

$env:https_proxy = "http://71.19.249.97:8443"

今後、すべてのcurlでのリクエストで、-xのオプションを追加しなくても指定されたプロキシを経由するようになります。

同様に、結果は次のようになります:

curl https://httpbin.org/ip

{

  "origin": "71.19.249.97"

}

curlのプロキシを無効にするには、次のように環境変数の設定を解除します。

unset http_proxy

unset https_proxy

またはウィンドウズの場合。

$env:http_proxy = ""

$env:https_proxy = ""

curlは標準の動作に戻り、https://httpbin.org/ipがあなたのIPアドレスを返します。

設定ファイルの使用

.curlrc設定ファイルを作成することで、curlのプロキシをグローバルに指定できます。

LinuxやmacOSの場合、ターミナルを開いてホームディレクトリに移動します。

cd ~

そこからnanoで.curlrcを開いてください。

nano .curlrc

ファイルが既に存在する場合は、そのファイルが開かれます。それ以外の場合は、ファイルを作成してから、そのファイルを開きます。

.curlrcファイルに次のコードを追加します。

proxy="http://71.19.249.97:8443"

シンタックスは次のとおりです。

proxy="[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

ファイルを保存し、ターミナルを閉じて再起動させてください。 

Windowsの場合、同じ内容の_curlrcファイルを%APPDATA%ディレクトリ内に作成する必要があります。ファイルエクスプローラーのアドレスバーに%APPDATA%と貼り付け、Enterキーを押してディレクトリにアクセスします。 

これでC:\Users\<YOUR_USER>\AppData\Roamingに移動するはずです。

これより、curlが設定ファイルで指定されたプロキシを自動的に使用するようになります。

curl "http://httpbin.org/ip"

次のようになります:

{

  "origin": "71.19.249.97"

}

素晴らしい!これで、curlでプロキシサーバーを使用する3つの異なる方法を学習することができました。

curlでSOCKSプロキシを設定する方法

SOCKsプロキシを使用する場合も、コマンドの構造は同じです。

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] <URL>

主な違いとなるのは<PROTOCOL>httphttpsの代わりに、socks4、またはsocks4asocks5socks5hになることです。

curl SOCKSプロキシの実行例の全体は次の通りです。

curl -x "socks5://94.14.109.54:2478" "http://httpbin.org/ip"

結果は思っていた通り、次のようになります。

{

  "origin": "94.14.109.54"

}

他にも、-xの代わりに--socks4--socks4a--socks5というオプションを使用する方法があります。この場合、オプションの後にユーザー名とパスワードなしでプロキシURLを指定し、--proxy-userの後に認証情報を設定する必要があります。

curl --socks4|--socks4a|--socks5 <HOST>[:<PORT>] <URL> --proxy-user <USERNAME>:<PASSWORD>

例:

curl --socks4 "93.16.238.41:8721" "http://httpbin.org/ip" --proxy-user admin334:kv4NsDgc3

こうすることで、93.16.238.41:8721 socks4プロキシ経由で、HTTPBinに接続できます。認証にはadmin334をユーザー名、Kv4NSDGC3をパスワードとして使用します。

知っておくべきヒントや小技

このセクションでは、curlプロキシをプロのように扱うための興味深い小技と貴重なヒントを紹介します。

プロキシのオン/オフをすばやく切り替える

ここでの目標は環境変数を使って、カスタムコマンドでプロキシの設定および設定解除をするためにエイリアスを定義することです。 

macOSまたはLinuxの場合、.bashrcファイルを作成することで同様のことを実現できます。これは、ユーザーがログインするたびに実行されるスクリプトファイルです。

ホームフォルダに移動します。

cd ~

次に.bashrcファイルを作成する、または開きます。

nano .bashrc

以下の形式のコンテンツをファイルに追加します。

alias proxyon="export http_proxy='[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]';export https_proxy='[<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]'"
alias proxyoff="unset http_proxy;unset https_proxy"

したがって、この例では次のようになります。

alias proxyon="export http_proxy='http://71.19.249.97:8443';export https_proxy='http://71.19.249.97:8443'"

alias proxyoff="unset http_proxy;unset https_proxy"

ファイルを保存して、マシンを再起動します。

これにより、次のようにしてcurlプロキシをオン/オフを切り替えられるようになります。

proxyon

curl "http://httpbin.org/ip"

# other HTTP requests...

proxyoff

自分で設定したproxyonproxyoffコマンドを書きとめておきましょう。これらは.bashrcファイル内のエイリアスで指定された操作を実行します。

Windowsの場合も、PowerShellのエイリアスを使用することで、同様のことが実現できます。

特定のリクエストでプロキシを無視する

curlが特定のリクエストに対して事前に設定したプロキシを使用しないようにするには、以下のように--noproxy "*“引数を使用します。

curl --noproxy "*" <URL>

こうすることで、curlがすべてのURLに自動でプロキシを使用する挙動を回避できます。

プロキシを設定して実行します。

curl --noproxy "*" "https://httpbin.org/ip"

実行後の送信元には、プロキシサーバーのIPではなく、ユーザーのIPが含まれます。

SSL証明書エラーを回避する

curlでプロキシを使用する場合、SSL証明書エラーが原因でリクエストが失敗する可能性があります。これを回避するには、以下のシンタックスのように-kオプションを使用してください。

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] -k <URL>

-kを使えば、セキュリティで保護されていないサーバーへのSSL接続を許可し、証明書エラーを回避できます。

例えば以下の方法を使うことで、SSLエラーを回避しながらHttpBinに接続できます。

curl -x "http://71.19.249.97:8443" -k "https://httpbin.org/ip"

リクエストに関する詳細情報を見る

curlのリクエストが失敗した場合に、何が起こったのかを理解するのは難しいものです。エラーを診断し、curlによって実行されたすべての操作を確認するには、-vオプションを設定します。

curl -x [<PROTOCOL>://][<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>] -v <URL>

次のコマンドを実行すると、curlが確立した接続と使用したヘッダーに関する詳細が表示されます。

$curl -x "http://71.19.249.97:8443" -v "https://httpbin.org/ip"

*   Trying 71.19.249.97:8443...

* Connected to 71.19.249.97 (71.19.249.97) port 8443 (#0)

* allocate connect buffer

* Establish HTTP proxy tunnel to httpbin.org:443

> CONNECT httpbin.org:443 HTTP/1.1

> Host: httpbin.org:443

> User-Agent: curl/8.0.1

> Proxy-Connection: Keep-Alive

>

< HTTP/1.0 200 OK

<

* CONNECT phase completed

* CONNECT tunnel established, response 200

* schannel: disabled automatic use of client certificate

* ALPN: offers http/1.1

* ALPN: server accepted http/1.1

* using HTTP/1.1

> GET /ip HTTP/1.1

> Host: httpbin.org

> User-Agent: curl/8.0.1

> Accept: */*

>

< HTTP/1.1 200 OK

< Date: Sat, 26 Aug 2023 10:39:13 GMT

< Content-Type: application/json

< Content-Length: 31

< Connection: keep-alive

< Server: gunicorn/19.9.0

< Access-Control-Allow-Origin: *

< Access-Control-Allow-Credentials: true

<

{

  "origin": "71.19.249.97"

}

* Connection #0 to host 71.19.249.97 left intact

curlにはどのようなプロキシが最適なのか

この質問に対する答えは、ユースケース、および使用するcurlリクエストの性質によって変わってきます。使用できるプロキシタイプの一覧を確認し、ニーズに合ったソリューションを見つけましょう。

  • データセンタープロキシ:高速ですがIP範囲が識別可能なため、すぐにサイトに検出され、ブロックされる可能性があります。
  • 住宅用プロキシ:特定の場所に実際にあるデバイスからのIPアドレスを使用するため、高い匿名性が保証されます。住宅用プロキシは地域制限ブロックがかかっているサイトやボット対策をしているサイトにアクセスしたり、curlでウェブスクレイピングしたりするのに最適です。
  • ISPプロキシ:ISPに登録されたデバイスのIPアドレスを使用するため、安全で高速かつ信頼性が高いのが特徴です。ISPプロキシはSEOモニタリング、Webブラウジング、および市場調査に最適なソリューションです。
  • モバイルプロキシ:実際のモバイルデバイスのIPを使用するため、高い匿名性が実現されます。モバイルデバイス向けに設計されたアプリケーションやサイト、コンテンツにアクセスするのに便利です。

以上が簡単な概要になりますが、詳細についてはプロキシIPタイプガイドをご覧ください。

まとめ

このcurlプロキシガイドでは、cURL とは何か、cURLで何ができるのか、そして HTTP/HTTPS/SOCKSプロキシの設定方法を学びました。上記の通り、無料プロバイダーのプロキシは頼りになりません。そのため、技術面で言えばどのプロキシプロバイダーを採用するのかが問題となります。市場大手のBright Dataを選んで、時間も手間も省きましょう。

Bright Dataは世界最高水準のプロキシサーバーを管理しており、フォーチュン500企業を含む2万社以上の顧客にサービスを提供しています。世界中に広がるプロキシネットワークで、以下のようなプロキシが提供されています。

総合的に見ても、Bright Dataはプロキシ業界で最大かつ最も信頼性の高いスクレイピング指向のプロキシネットワークの1つと言えます。業界最大のプロキシネットワークに参加して、無料トライアルを試してみましょう。