ネットワークに接続する場合、IPアドレスは一意の識別子として機能し、そのネットワーク内およびインターネットを介した通信と識別を可能にします。プロキシサーバーは、ユーザーのデバイスとインターネットの間の仲介役を務め、リクエストを管理してユーザーのIPアドレスを隠すことにより、セキュリティ、プライバシー、パフォーマンスを向上させます。
プロキシサーバーは、IPを隠してWebサイトへのアクセスを制御することで匿名性を確保し、脅威を排除します。特にWebスクレイピングに関しては、プロキシサーバーが重要な役割を果たし、ユーザーが IP 禁止を回避し、ジオブロッキング対策を回避するのに役立ちます。
このチュートリアルでは、プロキシの詳細と、PHPでWebスクレイピング用のプロキシサーバーを設定する方法を説明します。
PHPでのプロキシサーバーの使用
プロキシサーバーを設定する方法にはいろいろあります。ApacheやNginxなどのサーバーアプリケーションをフォワードプロキシサーバーとして使用することも、Squid などの専用プロキシツールを選択することもできます。このチュートリアルでは、Apacheをプロキシサーバーとして使用します。
PHPでWebスクレイピング用のプロキシサーバーをセットアップするには、システムにPHPがインストールされていることが必要です。インストールされていない場合、公式ドキュメントに従ってインストールします。この記事ではオペレーティングシステムとしてUbuntuを使用します。
Apacheによるプロキシサーバーのセットアップ
Apacheでは、mod_proxy
、mod_proxy_http
、mod_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プロキシを介してHttpBin
にGET
リクエストを行います。次に、応答コンテンツが取得されて表示されます。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プロキシを使用してウィキペディアをスクレイピングできます。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-paramaters
、Your-username
、Your-password
をご自身の認証情報で置き換えてください。
このコードでは、Webスクレイピングが確実にBright Dataプロキシネットワーク経由で行われるように、プロキシ情報がcurlリクエストに統合されています。
次に、ターミナルでphp scrape.php
を実行します。スクレイピング結果は以下の通りです:
リクエストが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スクレイピングを成功させ、効率的に行うための強固な基盤を提供します。
クレジットカードは必要ありません