PHPプロキシサーバー:PHPでプロキシを設定する方法

Webスクレイピングを強化し、セキュリティを確保し、ジオブロッキングを回避するためにPHPプロキシサーバーを設定する方法を説明します。
1 min read
PHP Proxy Server How to Set Up Proxies in PHP

ネットワークに接続する場合、IPアドレスは一意の識別子として機能し、そのネットワーク内およびインターネットを介した通信と識別を可能にします。プロキシサーバーは、ユーザーのデバイスとインターネットの間の仲介役を務め、リクエストを管理してユーザーのIPアドレスを隠すことにより、セキュリティ、プライバシー、パフォーマンスを向上させます。

プロキシサーバーは、IPを隠してWebサイトへのアクセスを制御することで匿名性を確保し、脅威を排除します。特にWebスクレイピングに関しては、プロキシサーバーが重要な役割を果たし、ユーザーが IP 禁止を回避し、ジオブロッキング対策を回避するのに役立ちます。

このチュートリアルでは、プロキシの詳細と、PHPでWebスクレイピング用のプロキシサーバーを設定する方法を説明します。

PHPでのプロキシサーバーの使用

プロキシサーバーを設定する方法にはいろいろあります。ApacheやNginxなどのサーバーアプリケーションをフォワードプロキシサーバーとして使用することも、Squid などの専用プロキシツールを選択することもできます。このチュートリアルでは、Apacheをプロキシサーバーとして使用します。

PHPでWebスクレイピング用のプロキシサーバーをセットアップするには、システムにPHPがインストールされていることが必要です。インストールされていない場合、公式ドキュメントに従ってインストールします。この記事ではオペレーティングシステムとしてUbuntuを使用します。

Apacheによるプロキシサーバーのセットアップ

Apacheでは、mod_proxymod_proxy_httpmod_proxy_connectモジュールを使用してApacheをプロキシサーバーとして機能させることができます。

プロキシサーバーをセットアップするには、まずこれらのモジュールを有効にします:

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_connect

次に、プロキシサーバーを定義するVirtualHostファイルを新規作成します:

cd /etc/apache2/sites-available/
sudo cp 000-default.conf proxy.conf

proxy.confファイルに以下のコードを貼り付けます:

<VirtualHost *:80>
    ServerName localhost
    ServerAdmin admin@localhost
    <IfModule mod_ssl.c>
            SSLEngine off
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    ProxyRequests On
    ProxyVia On
    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
</VirtualHost>

このコードでは、ProxyRequests OnによってApacheをフォワードプロキシサーバーにします。ProxyVia Onは、プロキシチェーンのリクエストパスを調べるのに役立つViaヘッダーを追加します。また、制御ブロックは誰がプロキシにアクセスできるかを宣言します。全てのホストがプロキシサーバーにアクセスできます。

詳細は、公式ドキュメントを参照してください。

VirtualHostを有効にしればプロキシサーバーのセットアップは完了です:

sudo a2ensite proxy.conf
service apache2 reload

プロキシサーバーの使用

以下のセクションでは、PHPコードでプロキシサーバーを使用する方法を説明します。通常、いかなるWebリクエストや自動化フレームワークも、プロキシを設定する仕組みを備えています。この記事では、curl、file_get_contents、Symfony BrowserKitという3種類の方法について説明します。

curlでプロキシを設定

まず最初に、HTTPリクエストを行うための強力なツールであるcURLライブラリを使用して、プロキシをPHPスクリプトに統合する方法を説明します。

以下のコードを収めたcurl.phpという名前のファイルを作成します。

<?php

$proxyUrl = 'http://localhost:80';
$targetUrl = 'https://httpbin.org/get';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

このスクリプトはcurlセッションを開始し、curl_setoptを使用してターゲットURLとプロキシURLを設定し、セッションを実行して応答を取得します。CURLOPT_PROXYオプションはプロキシを設定します。プロキシURLはlocalhost:80に設定されています。これは前のステップで作成したプロキシを利用します。

シンプルにするため、このスクリプトではSSL認証を無効にするオプションも含めています。ただし、実稼働環境では注意が必要です。実行中に発生したcurlエラーは、デバッグ目的で表示されます。

phpcurl.phpコマンドでスクリプトを実行します。

スクリプト実行後、Apacheアクセスログファイルを調べるとプロキシへのリクエストを追跡できます。アクセスログファイルは通常/var/log/httpd/access.logにあります。

このログファイルには、実行されたスクリプトに対応するCONNECTプロトコルを使用するエントリがあります。ここで、HTTPステータスコード200はリクエストが正常に処理されたことを示します。

127.0.0.1 - - [21/Dec/2023:12:34:56 +0530] "CONNECT httpbin.org:443 HTTP/1.1" 200 -

file_get_contentsにプロキシを設定

file_get_contentsを使用してPHPでプロキシをセットアップし、Apacheプロキシでコンテンツを取得することもできます。

そのためには、file_get_contents.phpというファイルを作成し、以下のコードを追加します。

<?php

$options = [
    'http' => [
        'proxy' => 'tcp://127.0.0.1:80',
        'request_fulluri' => true,
    ],
];
$context = stream_context_create($options);

$response = file_get_contents('https://httpbin.org/get', false, $context);

if ($response === false) {
    echo "Failed to retrieve data from $url";
} else {
    echo $response;
}

このPHPコードは、指定されたプロキシサーバーを使用してhttp://wikipedia.orgからデータを取得するHTTPリクエストを開始します。プロキシサーバーの詳細は$options配列で設定します。proxyキーはサーバーアドレス (‘tcp://127.0.0.1:80’) を定義し、request_fulluriをtrueに設定してリクエストURIを完全なURIとして扱います。

これらのオプションを追加するストリームコンテキストはstream_context_createを使用して作成します。実際のHTTPリクエストはfile_get_contentsで行われ、作成されたコンテキストが追加され、結果としてHttpBinからコンテンツが取得されます。

Symfony BrowserKitでプロキシを設定

Symfonyユーザーの場合、BrowserKitを使ってプロキシを簡単に統合できます。

Symfonyをインストールしていない場合、インストールします

Symfonyをセットアップしたら、PHPコードでプロキシを簡単に使用できます:

<?php

require './vendor/autoload.php';

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\HttpClient\HttpClient;

$proxyServer = 'http://127.0.0.1';
$proxyPort = '80';

$client = new HttpBrowser(HttpClient::create(['proxy' => sprintf('%s:%s', $proxyServer, $proxyPort)]));

$client->request('GET', 'https://httpbin.org/get');

$content = $client->getResponse()->getContent();

echo $content;

このコードブロックは、Symfony BrowserKitとHttpClientを使用して、$ProxyURLに設定されたApacheプロキシを介してHttpBinGETリクエストを行います。次に、応答コンテンツが取得されて表示されます。HttpBrowserインスタンスは指定されたプロキシ設定でセットアップされているため、プロキシを Symfonyアプリケーションに容易に統合できます。

従来のプロキシ統合方法の制限

PHPでプロキシを設定するのは簡単に思えるかもしれませんが、それらの方法には一定の制限があります。たとえば、複数のプロキシを手動で切り替えて使用することは可能ですが、大量のデータをスクレイピングする場合は非効率です。

さらに、プロキシが使用できなくなったり、IPが制限されたり、問題が発生したりした場合、これらの方法には代替プロキシに自動的に切り替える仕組みを備えていません。その結果、サービスの中断や、データ取得の失敗が発生して手動による介入が必要になります。プロキシを自動的に切り替えるコードを書くこともできますが、これは複雑なプロセスであり、最大限のセキュリティを確保するには、異なる地域に複数のプロキシサーバーをセットアップまたはレンタルする必要があります。

良いニュースは、Bright Dataがお役に立てるということです。

Bright Dataプロキシサーバー

Bright Dataは、Webスクレイピングと大規模なデータ収集のためのツールを提供するWebデータ抽出プラットフォームです。たとえば、Bright Dataが持つ世界中のプロキシサーバーの堅牢なコレクションを利用することで幅広いIPアドレスにアクセスでき、ジオブロッキングやIPバンを回避できます。

さらに、Bright Dataオンデマンドプロキシを利用すると、必要なリソースを必要なときに動的に取得できます。これは要件が変動するWebスクレイピング場合に便利で、最適なパフォーマンスと応答性を保証します。Bright Dataは、ユースケースに最適なプロキシを確実に使用できるように、さまざまなタイプのプロキシ(すなわち住宅用プロキシ、データセンタープロキシ、ISPプロキシ、モバイルプロキシ)を提供しています。

Bright Dataソリューションの主な利点の1つは、自動化されたプロキシローテーションです。これにより、匿名性が向上し、Webスクレイピング活動中の検出リスクが軽減されます。この機能と、世界中で770,000を超えるIPを誇る先進のデータセンタープロキシネットワークへのアクセスを併せ持つことで、Bright DataはWebスクレイピングに非常に優れた選択肢となっています。

PHPでのBright Dataプロキシの使用

Bright Dataの使い方は簡単です。必要なのは、無料アカウントにサインアップすることだけです。

アカウントを作成したら、サイドバーのプロキシとスクレイピングインフラをクリックし、住宅用プロキシの下にあるはじめるを選択します:

Bright Data住宅用プロキシの設定

ここでは、専用共有のどちらかを選択するなど、プロキシ設定を行います:

プロキシ設定の選択

プロキシ設定を選択したら、保存をクリックしてプロキシサービスを有効にします。Bright Dataはお客様に一意のログイン認証情報を提供します:

Bright Dataの認証情報:

Bright Dataプロキシ情報を基に、Bright Dataプロキシを使用してウィキペディアをスクレイピングできます。scrape.phpというファイルを作成し、以下のコードを追加します。

<?php

// BrightData proxy details
$proxyUrl = 'Your-proxy-url-from-the access-paramaters';
$proxyUser = 'Your-username:Your-password';

$targetUrl = 'https://en.wikipedia.org/wiki/Proxy_server';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyUser);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    $dom = new DOMDocument();
    @$dom->loadHTML($response);

    $content = $dom->getElementById('mw-content-text')->textContent;

    $headings = [];
    $headingsNodeList = $dom->getElementsByTagName('h2');
    foreach ($headingsNodeList as $heading) {
        $headings[] = $heading->textContent;
    }

    $headingsNodeList = $dom->getElementsByTagName('h3');
    foreach ($headingsNodeList as $heading) {
        $headings[] = $heading->textContent;
    }

    echo "Content:\n";
    echo $content . "\n\n";

    echo "Headings:\n";
    foreach ($headings as $index => $heading) {
        echo ($index + 1) . ". $heading\n";
    }
}

curl_close($ch);

Your-proxy-url-from-the access-paramatersYour-usernameYour-passwordをご自身の認証情報で置き換えてください。

このコードでは、Webスクレイピングが確実にBright Dataプロキシネットワーク経由で行われるように、プロキシ情報がcurlリクエストに統合されています。

次に、ターミナルでphp scrape.phpを実行します。スクレイピング結果は以下の通りです:

Bright Dataを使用してウィキペディアからスクレイピングされたデータの結果

リクエストがBright Dataプロキシ経由でルーティングされていることを確認するには、http://lumtest.com/myip.jsonにGETリクエストを送信してみてください。これをブラウザで開くと、ローカルISPの詳細を含むJSONオブジェクトで応答します。

これをBright Dataプロキシで試すには、以下のコードを新しいPHPファイルに保存して実行します:

<?php

// BrightData proxy details
$proxyUrl = 'brd.superproxy.io:22225';
$proxyUser = 'brd-customer-hl_0c2320f1-zone-residential_proxy1:j30hm0h2pqde';

$targetUrl = 'http://lumtest.com/myip.json';

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_PROXY, $proxyUrl);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $proxyUser);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

$response = curl_exec($ch);

if (curl_errno($ch)) {
    echo 'cURL Error: ' . curl_error($ch);
} else {
    echo $response;
}

curl_close($ch);

使用されているプロキシのロケーションとその他の詳細が出力されます:

{"ip":"91.66.16.153","country":"DE","asn":{"asnum":3209,"org_name":"Vodafone GmbH"},"geo":{"city":"Berlin","region":"BE","region_name":"Land Berlin","postal_code":"12205","latitude":52.428,"longitude":13.3095,"tz":"Europe/Berlin","lum_city":"berlin","lum_region":"be"}}

これにより、リクエストが実際にBright Dataプロキシサーバーを経由していることが確認されました。

まとめ

このチュートリアルでは、PHPでプロキシサーバーをセットアップするさまざまな方法について説明しました。Apacheを使用したローカルプロキシサーバーも選択肢の1つですが、Bright Dataプロキシサーバーを活用することで、効率と多用途性が新たなレベルに引き上げられます。

Bright Dataプロキシサーバーは包括的なグローバルプロキシネットワークを提供し、 住宅用ISPデータセンターモバイルプロキシなど、さまざまなIPへのアクセスを可能にします。さらに、Bright Dataのプロキシローテーション は、匿名性の向上とWebスクレイピング活動中の検出リスクの軽減に役立ちます。

シンプルさを求める初心者でも、高度な機能を必要とする経験豊富な開発者でも、Bright DataプロキシサーバーはWebスクレイピングを成功させ、効率的に行うための強固な基盤を提供します。