使用 Puppeteer 在 PHP 中解决 reCAPTCHA 以进行网页抓取

您是否在抓取数据时遇到 reCAPTCHA 障碍?我也遇到过。这些 CAPTCHA 挑战会将简单的抓取任务变成一大障碍。但别担心,我有一个解决方案可以帮助您轻松绕过这些障碍。

在本博文中,我将引导您使用 Puppeteer(一个功能强大的 Node.js 库)来应对 reCAPTCHA 挑战。然后,我们将将其与 PHP 集成,使您的网页抓取任务更加顺畅和高效。准备好在 reCAPTCHA 上大显身手,并无缝获取您的数据了吗?让我们开始吧!

网页抓取时什么是 reCAPTCHA?

为了让您了解一些背景信息,reCAPTCHA 是一种旨在保护网站免遭自动化滥用的系统。它要求用户完成对人类来说很容易但对机器人来说很困难的任务,例如识别图像中的物体或选中一个框。虽然这些挑战对于安全来说非常有用,但它们对于网页抓取来说却很麻烦。以下是您可能会遇到的基本类型:

  • reCAPTCHA v2:此版本以“我不是机器人”复选框和基于图像的挑战而闻名。用户可能需要点击图像或完成特定操作来证明他们不是机器人。它在区分真实用户和机器人方面非常有效。

使用 Puppeteer 在 PHP 中解决 reCAPTCHA 以进行网页抓取_第1张图片

  • reCAPTCHA v3:此版本在后台运行。它不直接要求用户交互,而是分析用户在整个网站上的行为,并分配一个风险评分。该评分帮助网站根据用户是机器人的可能性来决定是否授予或阻止访问权限。

reCAPTCHA Enterprise: 针对安全要求更高的企业,reCAPTCHA Enterprise 提供高级保护,抵御复杂的威胁。它包含增强风险分析、可自定义评分和改进可扩展性等功能,使其适合处理敏感信息或关键操作的组织。

难以解决烦人的验证码,并不断失败?

使用 Capsolver 的 AI 驱动的自动网页解锁技术,体验无缝自动验证码解决!

领取您的 奖励代码 以获得顶级验证码解决方案;CapSolver: WEBS。 兑换后,每次充值后您将获得额外 5% 的奖励,无限次

使用 Puppeteer 在 PHP 中解决 reCAPTCHA 以进行网页抓取_第2张图片

了解这些版本将帮助我们有效应对 reCAPTCHA 的挑战。让我们深入了解如何使用 Puppeteer 和 CapSolver 来应对这些挑战并简化我们的网页抓取工作。

CapSolver 如何帮助解决 reCAPTCHA

CapSolver 是一个强大的解决方案,用于处理包括 reCAPTCHA 在内的 CAPTCHA 挑战。以下是如何将 CapSolver 集成到您的工作流程中,以简化 CAPTCHA 解决:

  1. 检索网站密钥
    • 在浏览器请求日志中搜索类似 /recaptcha/api2/reload?k=6LcR_okUAAAAAPYrPe-HK_0RULO1aZM15ENyM-Mf 的请求。k= 参数是您需要的网站密钥。
    • 如果您提供错误的密钥,您将收到类似以下的错误消息:
      Solve failed! response: {"errorId":1,"errorCode":"ERROR_INVALID_TASK_DATA","errorDescription":"Invalid site key","taskId":"1cd1e687-96dd-4f14-b8ef-18b5d144d9b8","status":"failed"}
      
  • 如果您使用的是错误的 reCAPTCHA 版本(V2 或 V3),或者目标网站类型与 API 请求类型不匹配,您可能会看到:
    Solve failed! response: {"errorId":1,"errorCode":"ERROR_CAPTCHA_SOLVE_FAILED","errorDescription":"Failed to solve the captcha: 1001","taskId":"da450cbc-ff9d-439d-908a-77e7eb8852dd","status":"failed"}
    
  1. 设置您的环境

    • 安装必要的包:
      npm install axios puppeteer-core
      
  2. 编写集成代码



require_once 'vendor/autoload.php';
use Nesk\Puphpeteer\Puppeteer;
use Nesk\Rialto\Data\JsFunction;
use GuzzleHttp\Client;

$puppeteer = new Puppeteer;
$browser = $puppeteer->launch();

// TODO: 设置您的配置
$api_key = "YOUR_API_KEY"; // 您的 CapSolver API 密钥
$site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-"; // 目标网站的站点密钥
$site_url = "https://www.google.com/recaptcha/api2/demo"; // 目标网站的页面 URL

function capsolver()
{
    global $api_key, $site_key, $site_url;
    $client = new Client();
    $payload = [
        'clientKey' => $api_key,
        'task' => [
            'type' => 'ReCaptchaV2TaskProxyLess',
            'websiteKey' => $site_key,
            'websiteURL' => $site_url,
        ]
    ];

    try {
        $response = $client->post("https://api.capsolver.com/createTask", [
            'json' => $payload
        ]);
        $data = json_decode($response->getBody(), true);
        $task_id = $data['taskId'] ?? null;
        if (!$task_id) {
            echo "创建任务失败:" . json_encode($data) . PHP_EOL;
            return null;
        }
        echo "获取到 taskId:" . $task_id . PHP_EOL;

        while (true) {
            sleep(1);

            $getResultPayload = [
                'clientKey' => $api_key,
                'taskId' => $task_id
            ];
            $resp = $client->post("https://api.capsolver.com/getTaskResult", [


function capsolver()
{
    try {
        $client = new GuzzleHttp\Client();
        $resp = $client->post('https://api.capsolver.com/createTask', [
            'json' => $getResultPayload
            ]);
        $data = json_decode($resp->getBody(), true);
        $status = $data['status'] ?? null;

        if ($status === "ready") {
            return $data['solution']['gRecaptchaResponse'];
        }
        if ($status === "failed" || isset($data['errorId'])) {
            echo "Solve failed! response: " . json_encode($data) . PHP_EOL;
            return null;
        }
    } catch (\Exception $e) {
        echo "Error: " . $e->getMessage() . PHP_EOL;
        return null;
    }
}

function reqSite()
{
    global $site_url, $browser;
    $token = capsolver();
    if ($token === null) {
        return;
    }
    echo $token . PHP_EOL;

    $page = $browser->newPage();
    $page->goto($site_url);
    $evaluate_script = <<<EOD
        document.getElementById("g-recaptcha-response").value="$token";
        onSuccess("$token");
    EOD;
    $page->evaluate(JsFunction::createWithBody($evaluate_script));
    $product_element = $page->querySelector('#recaptcha-demo-submit');
    if ($product_element instanceof ElementHandle) {
        $product_element->click();
    } else {
        echo 'Element not found.' . PHP_EOL;
    }
}

reqSite();

无论您是在处理 reCAPTCHA v2、v3 还是 Enterprise,将 CapSolver 与 Puppeteer 集成都可以简化您的工作流程并提高您的抓取效率。如果您遇到任何问题或需要进一步的帮助,CapSolver 和 Puppeteer 都提供全面的文档和支持,以帮助您克服任何挑战。

你可能感兴趣的:(php,开发语言)