CAPSOLVER
博客
PHP 如何解决 Cloudflare 问题

如何用PHP解决Cloudflare问题

Logo of CapSolver

Lucas Mitchell

Automation Engineer

26-Nov-2024

Cloudflare能否检测到你的PHP爬虫?有没有办法解决其强大的防御措施而不被封禁?Cloudflare以其强大的安全措施而闻名,它使用Turnstile CAPTCHA和Bot Management等工具来过滤机器人和可疑活动。这些保护措施对PHP爬虫提出了巨大的挑战,因为它们严重依赖于检测模式并阻止任何看起来是自动化的内容。
让我们深入探讨一些方法,这些方法可以提高你使用PHP抓取受Cloudflare保护的网站的几率,但请记住,没有任何解决方案可以保证能战胜这个不断发展的安全系统。

什么是Cloudflare?

Cloudflare是一个广泛使用的安全和内容分发网络(CDN),旨在保护网站免受各种在线威胁,包括机器人、垃圾邮件发送者和拒绝服务(DoS)攻击。它充当网站服务器与其访问者之间的中间体,根据各种标准过滤请求,以确保只有合法流量才能到达服务器。Cloudflare强大的网络和安全工具有助于确保网站加载速度更快,并免受不需要的或有害的交互的影响。

为什么Cloudflare对PHP爬虫具有挑战性?

由于其复杂的机器人检测系统,Cloudflare已成为PHP爬虫的常见挑战。当它检测到潜在的自动化或可疑活动时,Cloudflare可以部署各种安全措施来验证访问者的合法性。这些措施包括:

JavaScript挑战

Cloudflare经常提供基于JavaScript的挑战(也称为JavaScript“遭受攻击”模式),这需要用户在访问网站之前执行JavaScript。这对PHP爬虫来说尤其具有挑战性,因为PHP本身并不处理JavaScript执行。解决方案通常涉及与无头浏览器或其他可以模拟JavaScript执行的工具集成。

Turnstile CAPTCHA和其他CAPTCHA

CAPTCHA是Cloudflare用来验证人机交互的另一层安全措施。特别是Turnstile CAPTCHA,用于防止自动化机器人访问受保护的页面。解决这些CAPTCHA需要CAPTCHA求解服务或人工干预,因为PHP本身无法解释和响应CAPTCHA。

机器人管理

Cloudflare的高级机器人管理系统使用机器学习来检测机器人典型的模式和行为。通过跟踪请求频率、用户代理一致性和IP信誉等细节,Cloudflare可以高度准确地识别和阻止机器人。这使得发送高频或重复请求的爬虫尤其困难。

基于IP的封锁和速率限制

Cloudflare监控IP地址并应用速率限制来检测和限制可疑流量。对于爬虫来说,这意味着来自同一IP地址的重复请求很可能会被标记和阻止。避免这种情况需要通过代理或轮换代理服务频繁轮换IP,这可能会增加复杂性和成本。

会话和Cookie管理

为了进一步验证用户,Cloudflare跟踪会话和Cookie。PHP爬虫必须一致地管理Cookie和会话,以在请求之间维护单个用户会话,这在没有高级Cookie处理功能的情况下在技术上可能难以实现。

简而言之,Cloudflare的多层防御系统专门设计用于检测和防止自动化流量,这使得PHP抓取工作特别具有挑战性。

如何在PHP中解决Cloudflare问题

由于其强大的机器人检测和安全措施(例如JavaScript挑战、CAPTCHA和高级机器人管理系统),Cloudflare对网络抓取提出了重大挑战。当尝试使用PHP抓取受Cloudflare保护的网站时,开发人员经常面临JavaScript执行、会话处理和CAPTCHA解析等障碍。

方法一:使用Selenium Stealth进行自动化

解决Cloudflare防御措施的一种流行方法是使用无头浏览器和自动化工具,例如Selenium Stealth。Selenium Stealth是Selenium WebDriver的增强层,旨在通过模拟更像人类的浏览行为来降低检测率。

- 示例代码:PHP中的Selenium Stealth

php 复制代码
// 加载所需的库
require_once 'vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use SapiStudio\SeleniumStealth\SeleniumStealth;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;

// Selenium服务器URL
$serverUrl = 'http://localhost:4444';

// 定义浏览器功能和选项
$chromeOptions = new ChromeOptions();
$chromeOptions->addArguments(['--headless', '--disable-gpu', '--no-sandbox']); // 无头模式用于自动化

$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY_W3C, $chromeOptions);

// 初始化WebDriver
$driver = RemoteWebDriver::create($serverUrl, $capabilities);

// 使用Selenium Stealth增强WebDriver
$stealthDriver = (new SeleniumStealth($driver))->usePhpWebriverClient()->makeStealth();

// 最大化浏览器窗口
$stealthDriver->manage()->window()->maximize();

// 导航到目标URL
$url = 'https://www.scrapingcourse.com/cloudflare-challenge';
$stealthDriver->get($url);

// 获取并打印页面源代码
$html = $stealthDriver->getPageSource();
echo $html;

// 关闭浏览器会话
$stealthDriver->quit();

使用Selenium Stealth的挑战

虽然Selenium Stealth是一种很有前景的方法,但它也存在很大的缺点:

  1. 高检测风险:Cloudflare的高级检测机制仍然可以将基于Selenium的浏览器标记为机器人,尤其是在大量使用的情况下。
  2. 元素处理问题:识别和交互页面元素以解决挑战可能不可靠。
  3. 性能开销:同时运行多个无头浏览器会消耗大量的系统资源,难以扩展。

虽然Selenium Stealth可以解决简单的防御措施,但它不是处理Cloudflare复杂安全措施的最佳解决方案。

方法二:使用CapSolver API

CapSolver 提供了一种强大的、基于API的方法来解决Cloudflare挑战。它不依赖于资源密集型自动化,而是利用强大的CAPTCHA求解技术来处理Cloudflare挑战,例如Turnstile CAPTCHA和基于JavaScript的挑战。

使用CapSolver的好处

  1. 效率:快速解决CAPTCHA和其他挑战,无需人工干预。
  2. 可扩展性:由于避免了运行多个浏览器的开销,因此适用于大规模操作。
  3. 简洁性:提供与PHP和其他编程语言的直接集成。
  4. 可靠性:以高精度处理即使是最复杂的挑战。

示例代码:PHP中的CapSolver

以下代码演示了如何使用CapSolver解决Cloudflare挑战并登录到受保护的网站。

php 复制代码
require 'vendor/autoload.php';

use GuzzleHttp\Client;

define("CAPSOLVER_API_KEY", "CAI-API_KEY");
define("PAGE_URL", "https://dash.cloudflare.com/login");
define("SITE_KEY", "0x4AAAAAAAJel0iaAR3mgkjp");

function callCapsolver() {
    $client = new Client();
    $data = [
        "clientKey" => CAPSOLVER_API_KEY,
        "task" => [
            "type" => "AntiTurnstileTaskProxyLess",
            "websiteURL" => PAGE_URL,
            "websiteKey" => SITE_KEY,
            "metadata" => ["action" => "login"]
        ]
    ];

    try {
        // 创建任务
        $response = $client->post('https://api.capsolver.com/createTask', [
            'json' => $data
        ]);
        $resp = json_decode($response->getBody(), true);
        $taskId = $resp['taskId'] ?? null;

        if (!$taskId) {
            echo "未找到taskId:" . $response->getBody() . PHP_EOL;
            return null;
        }

        echo "已创建taskId:$taskId" . PHP_EOL;

        // 轮询任务结果
        while (true) {
            sleep(1); // 等待1秒
            $resultResponse = $client->post('https://api.capsolver.com/getTaskResult', [
                'json' => [
                    "clientKey" => CAPSOLVER_API_KEY,
                    "taskId" => $taskId
                ]
            ]);
            $result = json_decode($resultResponse->getBody(), true);
            $status = $result['status'] ?? '';

            if ($status === "ready") {
                echo "已成功解决:" . $resultResponse->getBody() . PHP_EOL;
                return $result['solution'] ?? null;
            }

            if ($status === "failed" || isset($result['errorId'])) {
                echo "失败:" . $resultResponse->getBody() . PHP_EOL;
                return null;
            }
        }
    } catch (Exception $e) {
        echo "错误:" . $e->getMessage() . PHP_EOL;
        return null;
    }
}

function login($token, $userAgent) {
    $client = new Client();
    $headers = [
        'Cookie' => "cf_clearance=$token",
        'Host' => 'dash.cloudflare.com',
        'User-Agent' => $userAgent
    ];

    $data = [
        "cf_challenge_response" => $token,
        "email" => "[email protected]",
        "password" => "example_password"
    ];

    try {
        $response = $client->post('https://dash.cloudflare.com/api/v4/login', [
            'headers' => $headers,
            'form_params' => $data
        ]);

        echo "登录响应状态码:" . $response->getStatusCode() . PHP_EOL;
        if ($response->getStatusCode() !== 403) {
            echo "登录响应:" . $response->getBody() . PHP_EOL;
        }
    } catch (Exception $e) {
        echo "登录错误:" . $e->getMessage() . PHP_EOL;
    }
}

function run() {
    $solution = callCapsolver();
    $token = $solution['token'] ?? null;

    if ($token) {
        login($token, "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36");
    }
}

run();

为什么选择CapSolver而不是Selenium Stealth?

  1. 资源效率:无需运行无头浏览器,从而降低服务器成本和内存消耗。
  2. 易于实现:简单的API集成,无需复杂的浏览器配置。
  3. 成功率:绕过Cloudflare高级防御措施的可靠性更高。
  4. 企业级可扩展性:非常适合需要大量CAPTCHA求解的场景。

有关CapSolver及其功能的更多详细信息,请访问CapSolver文档

索取顶级验证码解决方案的奖励代码CapSolverWEBS。兑换后,每次充值后您将获得额外5%的奖励,无限次使用

最后的想法

Cloudflare的防御措施不断发展,这使得PHP爬虫越来越难以解决它们。虽然像Selenium Stealth这样的自动化工具可以处理基本场景,但CapSolver为应对高级挑战提供了更强大、更高效和更可扩展的解决方案。借助CapSolver的API,您可以确保获得更快、更可靠的结果,而无需处理复杂的浏览器自动化。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多