PHP代理服务器:如何在PHP中设置代理

了解如何设置PHP代理服务器以增强网络爬虫,确保安全并克服地理封锁。
1 min read
PHP代理服务器

当连接到网络时,IP地址充当唯一标识符,便于在该网络内和整个互联网中的通信和识别。代理服务器作为用户设备与互联网之间的中介,通过管理请求和隐藏用户的IP地址来提高安全性、隐私和性能。

代理服务器通过掩盖您的IP并控制网站访问来确保匿名性并帮助过滤威胁。具体到网络爬虫,代理服务器起着关键作用,帮助用户绕过IP封禁和避免地理封锁措施。

在本教程中,您将了解更多关于代理的知识,以及如何在PHP中设置代理服务器以进行网络爬虫。

在PHP中使用代理服务器

如果您想设置代理服务器,有多种方法可以实现。您可以使用像Apache或Nginx这样的服务器应用程序作为正向代理服务器,或者选择像Squid这样的专用代理工具。在本教程中,您将使用Apache作为代理服务器。

要设置用于PHP中的网络爬虫的代理服务器,您需要确保系统上已安装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头,有助于检查代理链中的请求路径。此外,<Proxy>控制块声明了谁可以访问代理。任何主机都可以访问代理服务器。

有关详细信息,请参阅官方文档

要完成代理服务器的设置,启用VirtualHost

sudo a2ensite proxy.conf
service apache2 reload

使用代理服务器

在接下来的部分中,您将学习如何在PHP代码中使用代理服务器。通常,任何网络请求或自动化框架都提供设置代理的机制。在本文中,您将了解三种方法:curlfile_get_contentsSymfony BrowserKit

在curl中设置代理

第一个方法将向您展示如何使用cURL库将代理集成到您的PHP脚本中,这是一种强大的HTTP请求工具。

创建一个名为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错误都会显示以便调试。

使用命令php curl.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请求,通过指定的代理服务器检索数据。代理服务器详细信息在$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通过配置的Apache代理($proxyUrl)向HttpBin发出GET请求。然后检索并显示响应内容。HttpBrowser实例设置了指定的代理设置,使其易于将代理集成到Symfony应用程序中。

传统代理集成方法的局限性

尽管在PHP中配置代理可能看起来很简单,但各种方法都有一定的局限性。例如,虽然可以手动切换不同的代理,但在爬取大量数据时,这是一种低效的方法。

此外,如果代理不可用或IP受到限制或遇到问题,这些方法本身并没有提供自动切换到备用代理的机制。这会导致服务中断或数据检索失败,需要手动干预。尽管您可以编写代码自动切换代理,但这是一个复杂的过程,您需要设置或租用多个不同地理区域的代理服务器以实现最大安全性。

好消息是Bright Data可以提供帮助。

Bright Data代理服务器

Bright Data是一个网页数据提取平台,提供大规模的网页爬取和数据收集工具。例如,Bright Data强大的全球代理服务器集合为您提供多种IP地址,有助于您克服地理封锁和IP封禁。

此外,Bright Data按需提供的代理可以帮助您在需要时动态获取所需资源。这在您的需求波动的网页爬取场景中非常有用,确保最佳性能和响应能力。Bright Data提供多种类型的代理(如住宅代理、数据中心代理、ISP代理和移动代理),确保您拥有最适合您用例的代理。

Bright Data解决方案的主要优势之一是自动代理轮换,这有助于在网络爬取活动中增强匿名性和减少检测风险。此功能,加上全球拥有超过77万个IP的先进数据中心代理网络,使Bright Data成为网络爬取的理想选择。

在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替换为您的具体凭据。

在此代码中,代理详细信息被集成到curl请求中,以确保通过Bright Data代理网络进行网页爬取。

接下来,在终端中运行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是一个选择,利用Bright Data代理服务器则引入了新的效率和多样性。

Bright Data代理服务器为您提供了全面的全球代理网络,确保访问多种IP地址,包括住宅代理ISP代理数据中心代理移动代理。此外,Bright Data的代理轮换有助于在网络爬虫活动中增强匿名性并减少检测风险。

无论您是寻求简单性的初学者,还是需要高级功能的经验丰富的开发人员,Bright Data代理服务器都为成功和高效的网页爬取提供了坚实的基础。