如何在 PHP 中通过 cURL 使用代理

本文将介绍如何通过代理在 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环境中实现轮询代理以及其可能为网络抓取过程带来的诸多益处。然而,我们必须指出,使用免费代理实现轮询代理也许并不理想。因此,对于更高要求的应用场景,一定要从实际的角度出发,选择合适的技术选型.

相关推荐
蝶开三月4 分钟前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
Ai 编码助手1 小时前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
wkj0013 小时前
php操作redis
开发语言·redis·php
黑客Ash12 小时前
【D01】网络安全概论
网络·安全·web安全·php
->yjy12 小时前
计算机网络(第一章)
网络·计算机网络·php
阳光帅气男孩13 小时前
PhpSpreadsheet导出图片
php
周全全14 小时前
Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
java·vue.js·spring boot·安全·php
Mr.Pascal15 小时前
刚学php序列化/反序列化遇到的坑(攻防世界:Web_php_unserialize)
开发语言·安全·web安全·php
建群新人小猿15 小时前
会员等级经验问题
android·开发语言·前端·javascript·php