DrissionPage 与 CapSolver:打造无痕、高效的自动化爬虫利器

1. 引言:自动化面临的挑战

在数据采集、自动化测试和业务运营等领域,Web 自动化已成为不可或缺的工具。然而,现代网站部署了日益复杂的反爬虫机制和验证码(CAPTCHA),这使得即使是精心设计的自动化脚本也可能功亏一篑。

DrissionPageCapSolver 的强强联合,为解决这一难题提供了强大的解决方案:

  • DrissionPage :一个基于 Python 的 Web 自动化工具,它能控制 Chromium 浏览器,但无需依赖 WebDriver,从而有效规避了常见的 WebDriver 检测。它将浏览器自动化与 HTTP 请求能力融为一体。
  • CapSolver:一个由 AI 驱动的验证码自动识别服务,能够处理 Cloudflare Turnstile、reCAPTCHA 等多种复杂验证码。

通过结合使用,这两个工具能够实现无缝的 Web 自动化,同时绕过 WebDriver 检测和验证码挑战。

1.1. 集成目标

本指南旨在帮助您实现以下三个核心目标:

  1. 规避 WebDriver 检测:利用 DrissionPage 的原生浏览器控制能力,避免暴露 Selenium/WebDriver 的特征。
  2. 自动解决验证码:集成 CapSolver 的 API,实现验证码挑战的自动处理,无需人工干预。
  3. 模拟人类行为:结合 DrissionPage 的动作链(Action Chains)和智能验证码解决方案,使自动化行为更接近真实用户。

2. DrissionPage 简介

DrissionPage 是一个功能强大的 Python Web 自动化工具,它将浏览器控制与 HTTP 请求能力集于一身。与传统的 Selenium 不同,它采用了自研内核来控制浏览器,使其更难被网站检测到。

2.1. 核心特性

  • 无需 WebDriver :原生控制 Chromium 浏览器,无需下载或更新 chromedriver
  • 双模式操作:同时支持浏览器自动化模式(d 模式)和 HTTP 请求模式(s 模式)。
  • 简化元素定位:提供直观的语法来查找和操作页面元素。
  • 跨 iframe 导航:无需切换上下文即可定位嵌套在 iframe 中的元素。
  • 多标签页支持:能够同时操作多个浏览器标签页。
  • 动作链:支持链式调用鼠标和键盘操作,模拟更自然的用户行为。
  • 内置等待机制:针对网络不稳定情况提供自动重试机制。

2.2. 安装

bash 复制代码
# 安装 DrissionPage
pip install DrissionPage

# 安装 requests 库,用于调用 CapSolver API
pip install requests

2.3. 基本用法示例

python 复制代码
from DrissionPage import ChromiumPage

# 创建浏览器实例
page = ChromiumPage()

# 导航到 URL
page.get('https://wikipedia.org')

# 查找并与元素交互
page('#search-input').input('Hello World')
page('#submit-btn').click()

3. CapSolver 简介

CapSolver 是一款基于 AI 的自动验证码识别服务,支持广泛的验证码类型。它提供了一个简单的 API 接口,允许您提交验证码挑战并在几秒内获得解决方案。

3.1. 支持的验证码类型

  • Cloudflare Turnstile:最常见的现代反机器人挑战。
  • Cloudflare Challenge
  • reCAPTCHA v2:包括基于图像和隐形变体。
  • reCAPTCHA v3:基于分数的验证。
  • AWS WAF:亚马逊 Web Services 验证码。
  • 以及更多类型...

3.2. CapSolver 入门

  1. capsolver.com 注册账户。
  2. 为您的账户充值。
  3. 从控制台获取您的 API 密钥。

3.3. API 端点

  • 服务器 A: https://api.capsolver.com
  • 服务器 B: https://api-stable.capsolver.com

4. 集成方法

4.1. API 集成(推荐)

API 集成方法为您提供了对验证码解决过程的完全控制,并且适用于 CapSolver 支持的任何验证码类型。

4.1.1. 核心集成模式

以下是创建任务和轮询结果的核心 Python 函数:

python 复制代码
import time
import requests
from DrissionPage import ChromiumPage

CAPSOLVER_API_KEY = "YOUR_API_KEY"
CAPSOLVER_API = "https://api.capsolver.com"


def create_task(task_payload: dict) -> str:
    """创建验证码解决任务并返回任务 ID。"""
    response = requests.post(
        f"{CAPSOLVER_API}/createTask",
        json={
            "clientKey": CAPSOLVER_API_KEY,
            "task": task_payload
        }
    )
    result = response.json()
    if result.get("errorId") != 0:
        raise Exception(f"CapSolver error: {result.get('errorDescription')}")
    return result["taskId"]


def get_task_result(task_id: str, max_attempts: int = 120) -> dict:
    """轮询任务结果,直到解决或超时。"""
    for _ in range(max_attempts):
        response = requests.post(
            f"{CAPSOLVER_API}/getTaskResult",
            json={
                "clientKey": CAPSOLVER_API_KEY,
                "taskId": task_id
            }
        )
        result = response.json()

        if result.get("status") == "ready":
            return result["solution"]
        elif result.get("status") == "failed":
            raise Exception(f"Task failed: {result.get('errorDescription')}")

        time.sleep(1)

    raise TimeoutError("CAPTCHA solving timed out")


def solve_captcha(task_payload: dict) -> dict:
    """完成验证码解决工作流。"""
    task_id = create_task(task_payload)
    return get_task_result(task_id)

4.2. 浏览器扩展集成

您也可以使用 CapSolver 浏览器扩展配合 DrissionPage,实现更"无感"的自动化解决。

4.2.1. 安装步骤
  1. capsolver.com/en/extension 下载 CapSolver 扩展。
  2. 解压扩展文件。
  3. 配置 API 密钥 :编辑扩展文件夹中的 config.js 文件,填入您的 API 密钥。
javascript 复制代码
// 在扩展文件夹中,编辑: assets/config.js
var defined = {
    apiKey: "YOUR_CAPSOLVER_API_KEY",  // 替换为您的实际 API 密钥
    enabledForBlacklistControl: false,
    blackUrlList: [],
    enabledForRecaptcha: true,
    enabledForRecaptchaV3: true,
    enabledForTurnstile: true,
    // ... 其他设置
}
  1. 将其加载到 DrissionPage 中:
python 复制代码
from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions()
co.add_extension('/path/to/capsolver-extension')

page = ChromiumPage(co)
# 扩展程序将自动检测并解决验证码

注意: 扩展程序必须配置有效的 API 密钥才能自动解决验证码。

5. 典型代码示例

5.1. 解决 Cloudflare Turnstile

Cloudflare Turnstile 是最常见的验证码挑战之一。以下是解决它的方法:

python 复制代码
import time
import requests
from DrissionPage import ChromiumPage

CAPSOLVER_API_KEY = "YOUR_API_KEY"
CAPSOLVER_API = "https://api.capsolver.com"


def solve_turnstile(site_key: str, page_url: str) -> str:
    """解决 Cloudflare Turnstile 并返回 token。"""
    # 创建任务
    response = requests.post(
        f"{CAPSOLVER_API}/createTask",
        json={
            "clientKey": CAPSOLVER_API_KEY,
            "task": {
                "type": "AntiTurnstileTaskProxyLess",
                "websiteURL": page_url,
                "websiteKey": site_key,
            }
        }
    )
    result = response.json()

    if result.get("errorId") != 0:
        raise Exception(f"Error: {result.get('errorDescription')}")

    task_id = result["taskId"]

    # 轮询结果
    while True:
        result = requests.post(
            f"{CAPSOLVER_API}/getTaskResult",
            json={
                "clientKey": CAPSOLVER_API_KEY,
                "taskId": task_id
            }
        ).json()

        if result.get("status") == "ready":
            return result["solution"]["token"]
        elif result.get("status") == "failed":
            raise Exception(f"Failed: {result.get('errorDescription')}")

        time.sleep(1)


def main():
    target_url = "https://your-target-site.com"
    turnstile_site_key = "0x4XXXXXXXXXXXXXXXXX"  # 在页面源码中查找

    # 创建浏览器实例
    page = ChromiumPage()
    page.get(target_url)

    # 等待 Turnstile 加载
    page.wait.ele_displayed('input[name="cf-turnstile-response"]', timeout=10)

    # 解决验证码
    token = solve_turnstile(turnstile_site_key, target_url)
    print(f"Got Turnstile token: {token[:50]}...")

    # 使用 JavaScript 注入 token
    page.run_js(f'''
        document.querySelector('input[name="cf-turnstile-response"]').value = "{token}";

        // 如果存在回调函数,也触发它
        const callback = document.querySelector('[data-callback]');
        if (callback) {{
            const callbackName = callback.getAttribute('data-callback');
            if (window[callbackName]) {{
                window[callbackName]('{token}');
            }}
        }}
    ''')

    # 提交表单
    page('button[type="submit"]').click()
    page.wait.load_start()

    print("成功绕过 Turnstile!")


if __name__ == "__main__":
    main()

5.2. 解决 reCAPTCHA v2(自动检测 Site Key)

此示例演示了如何自动从页面中检测 Site Key,无需手动配置:

python 复制代码
import time
import requests
from DrissionPage import ChromiumPage, ChromiumOptions

CAPSOLVER_API_KEY = "YOUR_API_KEY"
CAPSOLVER_API = "https://api.capsolver.com"


def solve_recaptcha_v2(site_key: str, page_url: str) -> str:
    """解决 reCAPTCHA v2 并返回 token。"""
    # 创建任务
    response = requests.post(
        f"{CAPSOLVER_API}/createTask",
        json={
            "clientKey": CAPSOLVER_API_KEY,
            "task": {
                "type": "ReCaptchaV2TaskProxyLess",
                "websiteURL": page_url,
                "websiteKey": site_key,
            }
        }
    )
    result = response.json()

    if result.get("errorId") != 0:
        raise Exception(f"Error: {result.get('errorDescription')}")

    task_id = result["taskId"]
    print(f"Task created: {task_id}")

    # 轮询结果
    while True:
        result = requests.post(
            f"{CAPSOLVER_API}/getTaskResult",
            json={
                "clientKey": CAPSOLVER_API_KEY,
                "taskId": task_id
            }
        ).json()

        if result.get("status") == "ready":
            return result["solution"]["gRecaptchaResponse"]
        elif result.get("status") == "failed":
            raise Exception(f"Failed: {result.get('errorDescription')}")

        time.sleep(1)


def main():
    # 只需提供 URL - Site Key 将自动检测
    target_url = "https://www.google.com/recaptcha/api2/demo"

    # 配置浏览器
    co = ChromiumOptions()
    co.set_argument('--disable-blink-features=AutomationControlled')

    print("Starting browser...")
    page = ChromiumPage(co)

    try:
        page.get(target_url)
        time.sleep(2)

        # 自动从页面检测 Site Key
        recaptcha_div = page('.g-recaptcha')
        if not recaptcha_div:
            print("No reCAPTCHA found on page!")
            return

        site_key = recaptcha_div.attr('data-sitekey')
        print(f"Auto-detected site key: {site_key}")

        # 解决验证码
        print("Solving reCAPTCHA v2...")
        token = solve_recaptcha_v2(site_key, target_url)
        print(f"Got token: {token[:50]}...")

        # 注入 token
        page.run_js(f'''
            var responseField = document.getElementById('g-recaptcha-response');
            responseField.style.display = 'block';
            responseField.value = '{token}';
        ''')
        print("Token injected!")

        # 提交表单
        submit_btn = page('#recaptcha-demo-submit') or page('input[type="submit"]') or page('button[type="submit"]')
        if submit_btn:
            submit_btn.click()
            time.sleep(3)
            print("Form submitted!")

        print(f"Current URL: {page.url}")
        print("SUCCESS!")

    finally:
        page.quit()


if __name__ == "__main__":
    main()

5.3. 使用动作链模拟人类行为

DrissionPage 的动作链提供了自然的鼠标移动和键盘输入,进一步增强了反检测能力:

python 复制代码
import time
import random
from DrissionPage import ChromiumPage
from DrissionPage.common import Keys, Actions

def human_delay():
    """随机延迟以模拟人类行为。"""
    time.sleep(random.uniform(0.5, 1.5))

def main():
    page = ChromiumPage()
    page.get('https://your-target-site.com/form')

    # 使用动作链进行类人交互
    ac = Actions(page)

    # 自然地移动到输入框,然后点击并输入
    ac.move_to('input[name="email"]').click()
    human_delay()

    # 像人类一样缓慢输入
    for char in "user@email.com":
        ac.type(char)
        time.sleep(random.uniform(0.05, 0.15))

    human_delay()

    # 移动到密码输入框
    ac.move_to('input[name="password"]').click()
    human_delay()

    # 输入密码
    page('input[name="password"]').input("mypassword123")

    # 解决验证码后,以自然移动的方式点击提交按钮
    ac.move_to('button[type="submit"]')
    human_delay()
    ac.click()

if __name__ == "__main__":
    main()

6. 最佳实践

6.1. 浏览器配置优化

配置 DrissionPage 以使其更像一个常规浏览器:

python 复制代码
from DrissionPage import ChromiumPage, ChromiumOptions

co = ChromiumOptions()
# 禁用 WebDriver 特征
co.set_argument('--disable-blink-features=AutomationControlled')
co.set_argument('--no-sandbox')
# 设置常见的 User-Agent
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')

# 设置常见的窗口分辨率
co.set_argument('--window-size=1920,1080')

page = ChromiumPage(co)

6.2. 随机延迟与限速

通过添加随机延迟来避免触发网站的速率限制:

python 复制代码
import random
import time

def human_delay(min_sec=1.0, max_sec=3.0):
    """随机延迟以模拟人类行为。"""
    time.sleep(random.uniform(min_sec, max_sec))

# 在操作之间使用
page('#button1').click()
human_delay()
page('#input1').input('text')

6.3. 错误处理与重试机制

始终为验证码解决实现适当的错误处理和重试逻辑:

python 复制代码
def solve_with_retry(task_payload: dict, max_retries: int = 3) -> dict:
    """带重试逻辑的验证码解决函数。"""
    for attempt in range(max_retries):
        try:
            return solve_captcha(task_payload)
        except TimeoutError:
            if attempt < max_retries - 1:
                print(f"Timeout, retrying... ({attempt + 1}/{max_retries})")
                time.sleep(5)
            else:
                raise
        except Exception as e:
            if "balance" in str(e).lower():
                raise  # 余额错误不重试
            if attempt < max_retries - 1:
                time.sleep(2)
            else:
                raise

7. 总结

DrissionPageCapSolver 的集成,为 Web 自动化创建了一个功能强大的工具集:

  • DrissionPage:处理浏览器自动化,规避 WebDriver 检测特征。
  • CapSolver:通过 AI 驱动的解决方案处理各种验证码。
  • 两者结合:实现看起来完全像人类操作的无缝自动化。

无论您是构建网络爬虫、自动化测试系统还是数据采集管道,这种组合都能提供您所需的可靠性和隐蔽性。

福利:CapSolver 注册时使用代码 DRISSION ,即可获得额外奖励积分!

8. 常见问题解答 (FAQ)

8.1. 为什么选择 DrissionPage 而非 Selenium?

DrissionPage 不使用 WebDriver,这意味着:

  • 无需下载/更新 chromedriver
  • 避免了常见的 WebDriver 检测特征。
  • API 更简洁,内置等待机制。
  • 性能和资源使用更优。
  • 原生支持跨 iframe 元素定位。

8.2. 哪些验证码类型最适合这种集成?

CapSolver 支持所有主流验证码类型。Cloudflare Turnstile 和 reCAPTCHA v2/v3 的成功率最高。该集成可与 CapSolver 支持的任何验证码无缝协作。

8.3. DrissionPage 能处理 Shadow DOM 吗?

是的!DrissionPage 通过 ChromiumShadowElement 类内置了对 Shadow DOM 元素的支持。

CapsolverCN官 方代理交流扣 群:497493756

相关推荐
怪力左手2 小时前
LSP、DAP语言服务器
运维·服务器·里氏替换原则
qq_5470261792 小时前
Linux 磁盘管理
linux·运维·服务器
qq_12498707532 小时前
基于spark的西南天气数据的分析与应用(源码+论文+部署+安装)
大数据·分布式·爬虫·python·spark·毕业设计·数据可视化
qq_366086222 小时前
sql server 整数转百分比
运维·服务器·数据库
喂自己代言2 小时前
Linux基础命令速查指南
linux·运维·服务器
bkspiderx2 小时前
详解Linux下xrandr工具:从基础配置到三显示器扩展桌面
linux·运维·计算机外设·显示器·分屏·xrandr·显示器扩展桌面
航Hang*2 小时前
第六章:网络系统建设与运维(中级)——链路聚合
运维·服务器·网络·笔记·华为·ensp
翼龙云_cloud2 小时前
阿里云云渠道商:GPU 服务器安全组配置指南 3 步解决端口开放问题
运维·服务器·安全·阿里云·云计算
会飞的土拨鼠呀2 小时前
array 这个是服务器的什么信息
运维·服务器