本文将介绍如何通过代理在 PHP 中执行 HTTP 请求。代理服务器充当 PHP 应用程序和互联网之间的网关,从而隐藏好你的真实 IP。代理服务器提供的安全性和匿名性,并允许你访问本国无法提供的服务等这些特性使得他大受欢迎。同时代理服务还是是网络爬虫的一大利器,因为它能帮助你避免 真实IP 被封禁.
为什么 PHP 需要代理?
代理服务器是充当客户端和服务器之间中介的服务。当客户端向服务器发送请求时,代理服务器拦截该请求并将其转发给服务器。因此,服务器将看到代理服务器的 IP 地址,而不是您的 IP 地址。这确保了匿名性。
如果您的 PHP 脚本执行 HTTP 请求,您应该在代理服务器后面执行它们,以保护您的 IP 不被封禁。因此,在使用 PHP 构建网络抓取工具或机器人时,代理会派上用场。
此外,PHP 中的代理服务器还可用于:
- 提高性能:代理服务器通过缓存客户端频繁请求的网页和资源,可以减轻原始服务器的负载,提高网络的整体性能。
- 过滤内容:代理服务器可以配置为出于审查原因阻止对某些网站的访问。
- 绕过限制:代理服务器可用于绕过地理或类似限制,允许用户访问原本不可用的内容。
代理服务器支持不同的协议,例如 HTTP、HTTPS 和 SOCKS,PHP 允许您使用所有这些类型的代理。现在让我们学习如何使用 cURL 在纯 PHP 中处理代理服务器。
如何在 PHP 中通过 cURL 使用代理服务器
在本节中,您将逐步了解在 PHP 中使用代理服务器从基本方法到更高级的方法所需的一切知识。
开始前准备工作
在开始学习使用 PHP 代理之前,您需要满足以下要求:
如果您不符合这些要求,请点击上面的链接,按照官方指南下载和配置您所需的内容。请注意,cURL 是 curl-ext PHP 扩展的一部分,通常包含在大多数 PHP 软件包中。如果下载的 PHP 软件包不包含该扩展,请按照官方安装指南安装 curl-ext。
从扩展名就不难猜到,curl-ext在后台使用cURL。因此,了解一下如何使用 cURL 代理服务器可能会对你有所帮助。
此外,请记住,网络代理通常用于网络爬虫等。因此,请跟随 PHP 网络搜索指南学习如何用 PHP 构建网络爬虫。在这里,你将看到如何扩展 PHP 搜索脚本,使其使用 cURL 中的服务器代理。
开始使用 cURL 中的代理
首先,让我们来着重了解一下如何在 cURL 中执行 HTTP 请求:
php
// initializing a cURL session
$ch = curl_init();
// setting the HTTP method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
// specifying the target URL
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
// return the result of the request as a string
// instead of printing it directly
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// sending the HTTP GET request
// and assigning its response to a variable
$response = curl_exec($ch);
// using the response of the HTTP request...
// close the cURL channel to free up
// some system resources
curl_close($ch);
正如你所看到的,用cURL执行一个请求只需要几行代码。使用curl_init()初始化cURL会话后,你可以通过curl_setopt()设置请求所需的所有选项。然后,使用curl_exec()执行HTTP请求。最后,当你不再需要当前的cURL会话时,可以用curl_close()关闭它。
需要注意的是,curl_init()返回的对象通常会被分配给一个名为ch的PHP变量,它代表 "cURL句柄",或简单的 "通道"。
现在,让我们扩展这个 cURL 例子,使用服务器代理。首先要记住,要连接到代理,需要指定以下信息:
- Proxy server address
- Port
- Protocol
- Username (如果需要验证)
- Password (如果需要验证)
我们假设 HTTP 代理的完整 URL 如下所示:
go
`206.189.156.117:8080`
然后:
206.189.156.117
是代理服务器地址8080
是端口HTTP
是协议
您可以在 cURL 中设置这些参数
bash
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117");
curl_setopt($curl, CURLOPT_PROXYPORT, "8080");
curl_setopt($curl, CURLOPT_PROXYTYPE, "CURLPROXY_HTTP");
请注意,CURLOPT_PROXYTYPE 接受以下值:
CURLPROXY_HTTP
CURLPROXY_SOCKS4
CURLPROXY_SOCKS5
CURLPROXY_SOCKS4A
CURLPROXY_SOCKS5_HOSTNAME
由于CURLPROXY_HTTP
是默认值并且大多数代理都是 HTTP 代理,因此您通常可以省略最后一行。CURLOPT_PROXY
此外,您还可以通过提供带有完整代理 URL 的选项 来直接指定代理端口。
换句话说,您可以通过 cURL 在 PHP 中使用代理,并使用以下一行代码:
bash
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117:8080");
连接到需要经过身份验证的代理
某些代理受身份验证保护。如果您想使用它们,您需要指定用户名和密码。要使用 cURL 连接到 PHP 中经过身份验证的代理服务器,请使用:
bash
curl_setopt($curl, CURLOPT_PROXYUSERPWD, "<username>:<password>");
请注意,cURL 选项接受的值CURLOPT_PROXYUSERPWD
必须采用 : 格式。
因此,假设您的用户名是zty1001
,密码是zty1001pw
,在 PHP 中使用 cURL 连接到代理服务器的完整示例是:
php
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// setting the proxy server URL
curl_setopt($curl, CURLOPT_PROXY, "206.189.156.117:8080");
// dealing with proxy authentication
curl_setopt($curl, CURLOPT_PROXYUSERPWD, "zty1001:zty1001pw");
$response = curl_exec($ch);
// using the response of the HTTP request...
curl_close($ch);
使用 cURL Rotating Proxies
代理服务器用于保护您的IP地址。您的 Web 爬虫目标站点将看到代理的IP,而非您的真实IP,这意味着若您频繁发起请求,可能会导致目标站点阻止代理服务器的IP。
简言之,依赖单一代理可能并非最佳解决方案。因此,为了使您的网络爬取流程避免被ban,您可以采纳一个轮流代理策略。轮流代理为每项新请求分配一个不同的IP地址。具体来说,轮流代理系统拥有一个备用的代理池,每次请求都可以随机从中选取。
采用这种方式,您的IP更不易被封锁,从而使网络爬取过程得以持续流畅地运行。要实现轮流代理,您需要一组代理。
现在让我们来学习如何在PHP中实现轮流代理策略。首先,您需要将您的代理池存储在一个变量内:
php
$proxies = array(
array(
"url" => "myproxy.com:8081",
"username" => null,
"password" => null
),
array(
"url" => "myproxy.com:8082",
"username" => "asdlwdcm18j",
"password" => "da913ma01dkannah803n"
),
// ...
array(
"url" => "myproxy.com:5001",
"username" => null,
"password" => null
),
);
现在,让我们构建一个函数来处理轮换代理逻辑:
php
function proxy_request($proxies, $ch, $max_attemps = 5, $wait = 2) {
$attemps = 0;
while ($attemps < $max_attemps) {
// getting a random proxy from
// the pool of proxies
$random_proxy = $proxies[array_rand($proxies)];
// if the proxy requires authentication
if (!is_null($random_proxy["username"]) && !is_null($random_proxy["password"])) {
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $random_proxy["username"] . ":" . $random_proxy["password"]);
}
// configuring the proxy to use
curl_setopt($ch, CURLOPT_PROXY, $random_proxy["url"]);
echo "Performing the request with the proxy: " . $random_proxy["url"] . "\n";
// performing the request
$result = curl_exec($ch);
// if the request failed
if (curl_errno($ch)){
echo "Request failed";
echo "Waiting " . $wait . "seconds...";
// waiting a number $wait of seconds
// before performing a new attempt again
sleep($wait);
// incrementing the attempt counter
$attemps++;
echo "Trying again...";
} else {
curl_close($ch);
return $result;
}
}
// in case of error
return false;
}
此函数旨在尝试为最多$max_attemps次请求,在预先定义的cURL handle中执行请求,并随机选取信息池中的代理进行使用。在此我需要再次提醒您,实施如上所述的重试逻辑是绝对必要的。这是因为免费代理往往容易出现故障。
然后您可以proxy_request()
按如下方式使用:
php
// $proxies = ...
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_URL, "https://www.example.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// performing the HTTP request through a
// rotating proxy
$response = proxy_request($proxies, $ch);
请注意,免费代理服务器速度慢且一般不可靠,最好在生产环境中选择一些商用的。
总结
正如您在此篇文章中所学到的,代理是网络抓取过程中不可或缺的工具。在详细的指导下,您已经掌握了如何在PHP环境中运用Web代理的所有必备技术。通过cURL在Web代理下执行HTTP请求,只需简单的几行代码即可实现。
此外,您还了解到如何在PHP环境中实现轮询代理以及其可能为网络抓取过程带来的诸多益处。然而,我们必须指出,使用免费代理实现轮询代理也许并不理想。因此,对于更高要求的应用场景,一定要从实际的角度出发,选择合适的技术选型.