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

相关推荐
七夜zippoe1 天前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy6481 天前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满1 天前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠1 天前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey9031 天前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技1 天前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀1 天前
Linux环境变量
linux·运维·服务器
zzzsde1 天前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
深蓝电商API1 天前
处理字体反爬:woff字体文件解析实战
爬虫·python
聆风吟º1 天前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann