CAPSOLVER
博客
如何将 CapSolver 集成到 Selenium | 2025年完整指南

如何将CapSolver与Selenium集成 | 2025完整指南

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

04-Sep-2025

什么是Selenium?

Selenium是一个开源的自动化测试工具,主要用于自动化Web应用程序。它也常用于网页抓取和自动化网站交互。Selenium可以模拟浏览器中各种用户行为,例如点击、输入、滚动和切换页面。它最初由Jason Huggins于2004年开发,现在由Selenium项目团队维护。Selenium支持多种编程语言,包括Python、Java、C#、Ruby和JavaScript。

Selenium包含以下核心组件:

  1. Selenium WebDriver(最常用)

    • 提供对浏览器的原生控制,支持Chrome、Firefox、Edge和Safari等主要浏览器。
    • 可以模拟各种浏览器操作,例如点击、输入、滚动和切换标签页。
    • 每个浏览器都有相应的驱动程序,例如chromedrivergeckodriver
  2. Selenium IDE

    • 一个浏览器扩展程序(适用于Chrome/Firefox),允许录制和回放测试脚本。对于测试新手来说非常理想。
  3. Selenium Grid

    • 通过使用多个浏览器和机器形成测试网格来实现分布式测试,允许并行执行脚本。

常用案例

  • 抓取动态内容: 提取由JavaScript渲染生成的数据。
  • 处理复杂的交互: 适用于需要登录或多步骤操作才能访问数据的网站抓取。
  • 从SPA应用程序中提取数据: 抓取使用Vue或React等框架构建的页面。
  • 自动化测试: 在收集数据的同事验证页面功能。
  • 使用无头模式: 在没有图形界面情况下执行所有操作,非常适合在服务器上运行。

Selenium的基本用法

在Python中使用Selenium:

bash 复制代码
pip install selenium

要将Selenium与Chrome一起使用,请从Github下载与你的Chrome版本匹配的chromedriver

示例:使用Selenium获取CapSolver博客的所有博客文章标题:

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 指定chromedriver路径(如果已添加到PATH,可以省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

try:
    driver.get("https://www.capsolver.com/blog/All")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'h5')))

    h5_elements = driver.find_elements(By.TAG_NAME, "h5")
    for el in h5_elements:
        print(el.text.strip())

finally:
    driver.quit()

如何将CapSolver扩展程序与Selenium集成

Selenium是一个强大的工具,它支持加载浏览器扩展程序,就像普通的浏览器一样。

  1. 从官方CapSolver GitHub下载最新的扩展程序.zip包并解压:
    👉 https://github.com/capsolver/capsolver-browser-extension/releases

  2. 在Selenium的启动选项中,使用load-extension参数指定扩展程序路径:

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
chrome_options.add_argument("load-extension=/path/to/capSolver extension")

# 指定chromedriver路径(如果已在PATH中,则省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

try:
    driver.get("https://www.capsolver.com/blog/All")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, 'h5')))

    h5_elements = driver.find_elements(By.TAG_NAME, "h5")
    for el in h5_elements:
        print(el.text.strip())

finally:
    driver.quit()

⚠️ 重要提示:Chrome v137 开始,浏览器自动化在加载扩展时可能会失败。
若不添加以下参数,Chrome 137+ 将 无法正常加载扩展,从而导致验证码无法被解决:

python 复制代码
chrome_options.add_argument("--disable-features=DisableLoadExtensionCommandLineSwitch")

更多详情:SeleniumHQ。不同的版本可能会有不同的行为——请根据你的环境进行调整。

使用CapSolver扩展程序解决reCAPTCHA v2

像reCAPTCHA、Cloudflare Turnstile、AWS WAF和GeeTest这样的CAPTCHA广泛应用于数千个网站。但是,它们的DOM结构在各个网站之间基本保持一致。CapSolver扩展程序可以根据其独特的特征自动检测并解决这些CAPTCHA——无需手动交互。

让我们以reCAPTCHA v2为例,演示如何在Selenium中使用CapSolver扩展程序绕过它。
(注意:除非另有说明,否则以下演示使用click模式:设置在/assets/config.js → reCaptchaMode: 'click'

🛠️ 不要忘记解压扩展程序并在/assets/config.js中配置你的apiKey

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 步骤1:从GitHub获取扩展程序:https://github.com/capsolver/capsolver-browser-extension/releases
# 步骤2:解压扩展程序并在/assets/config.js中设置你的apiKey
chrome_options.add_argument("load-extension=/path/to/CapSolver Browser Extension-v1.16.0")

# 指定chromedriver路径(如果已在PATH中,则省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

try:
    driver.get("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'form[action="/recaptcha-v2-checkbox.php"]')))

    # 扩展程序将自动检测并解决reCAPTCHA
    time.sleep(15)

    # 解决后,点击提交按钮
    submit_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
    submit_button.click()
    time.sleep(3)

except Exception as error:
    print(error)

finally:
    driver.quit()

CapSolver扩展程序还支持许多有用的配置选项。所有设置都可以在/assets/config.js文件中调整。

solvedCallback配置选项

在前面的示例中,我们在加载页面后等待了15秒才点击提交按钮。这个等待时间是为了给CapSolver扩展程序足够的时间自动解决reCAPTCHA。
但是,这种方法并不优雅。在实践中,解决CAPTCHA可能需要不到15秒,或者在网络缓慢的情况下,超过15秒

为了解决这个问题,CapSolver提供了一个名为solvedCallback的配置选项。这允许你定义一个回调函数,该函数在成功解决CAPTCHA后被触发。你可以在/assets/config.js中找到solvedCallback选项,并且可以自定义函数名称——默认情况下,它是captchaSolvedCallback

如果你使用的是PuppeteerPlaywright,你可以使用page.exposeFunction方法将此回调函数暴露给浏览器上下文。参见:

Python + Selenium怎么办?

不幸的是,Python的Selenium没有提供与page.exposeFunction等效的内置功能,因此在此环境中无法完全利用solvedCallback功能

相反,我们建议使用DOM观察来确定CAPTCHA是否已解决。例如,你可以检查**“我不是机器人”复选框**是否已消失或变为勾选标记(✔),这表明验证已完成。

让我们通过使用此策略改进前面的示例:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 步骤1:从GitHub获取扩展程序:https://github.com/capsolver/capsolver-browser-extension/releases
# 步骤2:解压扩展程序并在/assets/config.js中设置你的apiKey
chrome_options.add_argument("load-extension=/path/to/CapSolver Browser Extension-v1.16.0")

# 指定chromedriver路径(如果已在PATH中,则省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

def check_recaptcha_status(driver):
    try:
        iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[src*="recaptcha"]')
        driver.switch_to.frame(iframe)

        # 检查类名是否指示复选框已被选中
        recaptcha_anchor = driver.find_element(By.ID, "recaptcha-anchor")
        class_list = recaptcha_anchor.get_attribute("class")
        driver.switch_to.default_content()
        if "recaptcha-checkbox-checked" in class_list.split():
            return True
        else:
            return False
    except Exception as e:
        print(f"Failed to check reCAPTCHA status: {e}")
        driver.switch_to.default_content()
        return False

try:
    driver.get("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'form[action="/recaptcha-v2-checkbox.php"]')))

    # 扩展程序将自动识别并解决CAPTCHA。
    # 不要睡眠固定时间,而是定期检查。
    timeout = 30
    start_time = time.time()
    while time.time() - start_time < timeout:
        if check_recaptcha_status(driver):
            print("reCAPTCHA verification successful!")
            submit_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
            submit_button.click()
            time.sleep(3)
            driver.quit()
            break
        time.sleep(1)

except Exception as error:
    print(error)

finally:
    driver.quit()

manualSolving配置选项

在前面的示例中,CAPTCHA解决过程在页面加载完成后立即自动启动。但是,在某些情况下,你可能需要首先执行其他操作——例如填写用户名和密码——然后再触发CAPTCHA求解器。过早解决CAPTCHA可能会导致令牌在提交前过期。

manualSolving选项旨在解决此问题。通过在/assets/config.js中设置manualSolving: true,你可以使用以下两种方法之一手动触发CAPTCHA求解

  1. 通过Selenium模拟点击CapSolver扩展程序按钮。
  2. 执行脚本发布消息:window.postMessage({ type: 'capsolverSolve' });
    (注意:此方法支持v1.16.0及以上版本的扩展程序。)

以下示例演示如何使用这两种方法:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 步骤1:从GitHub获取扩展程序(https://github.com/capsolver/capsolver-browser-extension/releases)
# 步骤2:解压扩展程序并在/assets/config.js中配置你的apiKey
chrome_options.add_argument("load-extension=/path/to/CapSolver Browser Extension-v1.16.0")

# 指定chromedriver路径(如果已在PATH中,则省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

def check_recaptcha_status(driver):
    try:
        iframe = driver.find_element(By.CSS_SELECTOR, 'iframe[src*="recaptcha"]')
        driver.switch_to.frame(iframe)

        # 确定复选框是否已被选中
        recaptcha_anchor = driver.find_element(By.ID, "recaptcha-anchor")
        class_list = recaptcha_anchor.get_attribute("class")
        driver.switch_to.default_content()
        if "recaptcha-checkbox-checked" in class_list.split():
            return True
        else:
            return False
    except Exception as e:
        print(f"Failed to check reCAPTCHA status: {e}")
        driver.switch_to.default_content()
        return False

try:
    driver.get("https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'form[action="/recaptcha-v2-checkbox.php"]')))

    # 模拟用户输入
    driver.execute_script("""
        const inputA = document.querySelector('input[name="ex-a"]');
        inputA.value = 'username';
        const inputB = document.querySelector('input[name="ex-b"]');
        inputB.value = 'password';
    """)

    # 模拟额外操作
    for i in range(1, 6):
        time.sleep(1)
        print(f"Waited {i} seconds...")

    # 触发CAPTCHA求解(必须在config.js中将manualSolving设置为true)
    print("Start solving captcha...")

    # 方法1:模拟点击CapSolver按钮
    try:
        capsolver_button = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#capsolver-solver-tip-button")))
        driver.execute_script("arguments[0].click();", capsolver_button)
    except Exception as e:
        print(f"Unable to find CapSolver button: {e}")

    # 方法2:通过postMessage触发(替代方法)
    # driver.execute_script("window.postMessage({ type: 'capsolverSolve' });")

    # 等待CAPTCHA被解决并提交表单
    timeout = 30
python 复制代码
start_time = time.time()
while time.time() - start_time < timeout:
    if check_recaptcha_status(driver):
        print("reCAPTCHA验证成功!")
        submit_button = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
        submit_button.click()
        time.sleep(3)
        driver.quit()
        break
    time.sleep(1)

except Exception as error:
    print(error)

finally:
    driver.quit()

reCaptchaMode 配置

reCaptchaMode 支持两种模式:“click” 和 “token”。

  • click: 模拟人工点击图片验证码。
  • token: 跳过点击步骤,直接通过 API 将任务提交到 CapSolver 后端,验证码解决后返回 token。

如果您发现使用 click 模式需要多次点击图片验证码,这可能表示您的本地环境质量较低。在这种情况下,建议使用 token 模式以获得更好的性能。

点击模式 token 模式

showSolveButton 配置

当您设置 showSolveButton: false(默认为 true)时,CapSolver 解题按钮将不再显示在页面上。
但是,这不会影响验证码解决功能,它仍然会在后台正常工作。

useProxy 配置

启用 useProxy: true 后,您可以指定以下代理设置:

  • proxyType
  • hostOrIp
  • port
  • proxyLogin
  • proxyPassword

然后我们将使用您的自定义代理来解决验证码。

什么情况下应该使用您自己的代理?以下是两种常见场景:

  1. 您的代理提供更好的质量(例如,为 reCAPTCHA token 生成更高的分数)或更快的解决速度
  2. 在某些情况下,用于解决验证码的 IP 必须与用于提交 token 的 IP 相匹配,这需要使用您的代理。

以上是一些常用的配置选项。您可以根据实际需要调整其他设置。如有任何疑问,请联系我们的客户支持

使用 CapSolver 扩展解决 ImageToText

与 reCAPTCHA、Cloudflare Turnstile、AWS WAF 等第三方验证码不同,还有一种类型的验证码需要识别图像中的字母或数字——我们称之为ImageToText 验证码。它们通常如下所示:

ImageToText 验证码通常是网站所有者自定义实现的。由于这些验证码在不同网站和页面的放置位置各不相同,因此CapSolver 扩展程序无法自动检测哪些图像是验证码。您需要在代码中手动指出这一点。

操作方法:

  1. 向验证码图像元素添加 capsolver-image-to-text-source 属性(值为 0)。
  2. 向结果输入元素添加 capsolver-image-to-text-result 属性(值为 0)。

capsolver-image-to-text-sourcecapsolver-image-to-text-result 都可以在 /assets/config.js 中配置,分别位于 textCaptchaSourceAttributetextCaptchaResultAttribute 选项下。

让我们以demo为例,演示如何使用 Selenium 解决 ImageToText 验证码:

从页面源代码中,我们识别出:

  • 验证码图像元素 ID:demoCaptcha_CaptchaImage
  • 结果输入字段 ID:captchaCode

如下所示:

我们现在可以使用 Selenium 脚本中的 setAttribute 方法添加所需的属性:

python 复制代码
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 步骤 1:从 GitHub 获取扩展程序 (https://github.com/capsolver/capsolver-browser-extension/releases)
# 步骤 2:解压扩展程序 zip 文件并在 /assets/config.js 中配置您的 apiKey
chrome_options.add_argument("load-extension=/path/to/CapSolver Browser Extension-v1.16.0")

# 指定 chromedriver 的路径(如果已添加到 PATH,则可以省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

try:
    driver.get("https://captcha.com/demos/features/captcha-demo.aspx")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#demoCaptcha_CaptchaImage')))

    # 告诉 CapSolver 扩展程序验证码图像的位置
    driver.execute_script("""
        const imgElement = document.querySelector('#demoCaptcha_CaptchaImage');
        if (imgElement) {
            imgElement.setAttribute('capsolver-image-to-text-source', '0');
        }
    """)

    # 告诉 CapSolver 扩展程序应在何处输入识别结果
    driver.execute_script("""
        const resultElement = document.querySelector('#captchaCode');
        if (resultElement) {
            resultElement.setAttribute('capsolver-image-to-text-result', '0');
        }
    """)

    time.sleep(5)
    validate_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'validateCaptchaButton')))
    validate_button.click()
    time.sleep(5)

except Exception as error:
    print(error)

finally:
    driver.quit()

预期结果:

如何将 CapSolver API 与 Selenium 集成

使用 CapSolver 浏览器扩展程序方便快捷。但是,如果您是一位经验丰富的开发者,我们建议您改用 API 方法。与基于扩展程序的集成相比,API 方法具有以下几个优点:

  1. 您可以自定义更多参数,输入更精确——能够处理几乎所有验证码场景。
  2. 您可以更好地控制何时解决验证码。
  3. API 提供更详细的错误消息,帮助您有效地优化逻辑。

开始之前

您需要了解如何使用 CapSolver API。此过程涉及两个步骤:

  • 步骤 1: 通过 https://api.capsolver.com/createTask 创建任务
  • 步骤 2: 通过 https://api.capsolver.com/getTaskResult 获取结果

创建任务时,您需要向 CapSolver 发送 JSON 负载,其中通常包括 clientKeywebsiteURLwebsiteKey 等参数。这些参数根据验证码类型和目标网站而有所不同。有关完整详细信息,请参阅我们的文档

使用 CapSolver API 解决 reCAPTCHA v2

在解决 reCAPTCHA v2 之前,请参阅指南:
👉 https://docs.capsolver.com/en/guide/captcha/ReCaptchaV2/
它准确解释了请求中应包含哪些 JSON 字段。

此外,您可以使用 CapSolver 扩展程序快速提取所需的 JSON 数据。请参阅此博客以获取帮助:
🔗 获取 JSON 数据

让我们以以下示例为例:https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php,
所需的 JSON 负载为:

json 复制代码
{
    "type": "ReCaptchaV2TaskProxyLess",
    "websiteKey": "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9",
    "websiteURL": "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
}

我们的文档中还提供了使用 API 的 Python 代码示例:

示例:与 Selenium 集成 (Python)

python 复制代码
import time
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 指定 chromedriver 的路径(如果已添加到 PATH,则可以省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

# TODO:配置您的 CapSolver 设置
api_key = "YOUR_API_KEY"  # 请替换为您的 CapSolver API 密钥
site_key = "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9"  # reCAPTCHA 站点密钥
site_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"  # 目标页面 URL
captcha_type = 'ReCaptchaV2TaskProxyLess'

def capsolver():
    payload = {
        "clientKey": api_key,
        "task": {
            "type": captcha_type,
            "websiteKey": site_key,
            "websiteURL": site_url
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    task_id = resp.get("taskId")
    if not task_id:
        print("创建任务失败:", res.text)
        return ""
    print(f"获取 taskId:{task_id} / 获取结果...")

    while True:
        time.sleep(1)
        payload = {"clientKey": api_key, "taskId": task_id}
        res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
        resp = res.json()
        status = resp.get("status")
        if status == "ready":
            return resp.get("solution", {}).get('gRecaptchaResponse')
        if status == "failed" or resp.get("errorId"):
            print("解决失败!响应:", res.text)
            return ""

try:
    token = capsolver()
    print("token:", token)

    driver.get(site_url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'form[action="/recaptcha-v2-checkbox.php"]')))

    # 注入 reCAPTCHA 响应 token
    driver.execute_script("""
        const textarea = document.getElementById('g-recaptcha-response');
        if (textarea) {
            textarea.value = arguments[0];
        }
    """, token)

    # 点击提交按钮
    submit_button = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[type="submit"]')))
    submit_button.click()
    time.sleep(5)

except Exception as error:
    print(error)

finally:
    driver.quit()

使用 CapSolver API 解决 ImageToText

让我们继续使用示例站点:https://captcha.com/demos/features/captcha-demo.aspx
在此页面上,验证码图像元素的 ID 为 demoCaptcha_CaptchaImage,结果的输入字段的 ID 为 captchaCode,如下图所示:

ImageToTextTask 中,我们需要将验证码图像的 base64 编码值传递给 CapSolver。以下是一个有效的示例:

python 复制代码
import time
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")

# 指定 chromedriver 路径(如果已添加到 PATH,则可以省略)
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

# TODO:设置您的 CapSolver 配置
api_key = "YOUR_API_KEY"  # 请替换为您的 CapSolver API 密钥
site_url = "https://captcha.com/demos/features/captcha-demo.aspx"  # 目标页面 URL
captcha_type = 'ImageToTextTask'

def capsolver(base64Image):
    payload = {
        "clientKey": api_key,
        "task": {
            "type": captcha_type,
            "websiteURL": site_url,
            "body": base64Image
        }
    }
    res = requests.post("https://api.capsolver.com/createTask", json=payload)
    resp = res.json()
    status = resp.get("status")
    if status == "ready":
        return resp.get("solution", {}).get('text')
    elif status == "failed" or resp.get("errorId"):
        print("解决失败!响应:", res.text)
        return ""
    else:
        print("未知响应:", resp.text)
        return ""

try:
    driver.get(site_url)
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#demoCaptcha_CaptchaImage')))

    # 从验证码图像的 src 属性中检索 base64 字符串
    captcha_src = driver.execute_script("""
        const img = document.querySelector('img[id="demoCaptcha_CaptchaImage"]');
        return img ? img.getAttribute('src') : null;
    """)

    if not captcha_src:
        raise Exception("无法获取验证码图像!")

    base64_image = captcha_src.split(',')[1]  # 删除 'data:image/png;base64,' 前缀
    captcha_text = capsolver(base64_image)
    print("文本:", captcha_text)

    # 填写验证码结果
    driver.execute_script("""
        document.getElementById('captchaCode').value = arguments[0];
    """, captcha_text)

    # 点击验证按钮
    validate_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '#validateCaptchaButton'))
    )
    validate_button.click()
    time.sleep(5)

except Exception as error:
    print(error)

finally:
    driver.quit()

对于某些类型的复杂 ImageToText 验证码,您可以指定不同的识别模型以提高准确性。有关更多详细信息,请参阅官方文档:
👉 https://docs.capsolver.com/en/guide/recognition/ImageToTextTask/

如何将 CapSolver SDK 与 Selenium 集成

CapSolver 提供了 PythonGolang 的官方 SDK,使您可以轻松集成验证码求解功能。与使用原始 API(您必须手动处理 createTaskgetTaskResult)不同,SDK 简化了整个流程。

官方 GitHub 仓库:

使用 CapSolver SDK 求解 reCAPTCHA v2

就像使用 API 一样,在求解 reCAPTCHA v2 之前,您应该参考文档以获取有关要发送哪些 JSON 参数的详细信息:
🔗 https://docs.capsolver.com/en/guide/captcha/ReCaptchaV2/
此外,您可以使用 CapSolver 浏览器扩展程序快速提取所需的 JSON 数据:
🔗 https://www.capsolver.com/blog/reCAPTCHA/recaptcha-v3-solver-human-score

让我们以这个页面为例:
👉 https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php

所需的 JSON 数据如下所示:

json 复制代码
{
  "type": "ReCaptchaV2TaskProxyLess",
  "websiteKey": "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9",
  "websiteURL": "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
}

安装 CapSolver SDK:

bash 复制代码
pip install capsolver

示例:在 Selenium 中使用 SDK

python 复制代码
import time
import capsolver
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

# 设置您的 CapSolver 配置
api_key = "YOUR_API_KEY"
site_key = "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9"
site_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
captcha_type = 'ReCaptchaV2TaskProxyLess'
capsolver.api_key = api_key

try:
    # 使用 SDK 求解
    solution = capsolver.solve({
        "type": captcha_type,
        "websiteURL": site_url,
        "websiteKey": site_key,
    })
    token = solution["gRecaptchaResponse"]
    print("token:", token)

    driver.get(site_url)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, 'form[action="/recaptcha-v2-checkbox.php"]'))
    )

    driver.execute_script("""
        const textarea = document.getElementById('g-recaptcha-response');
        if (textarea) {
            textarea.value = arguments[0];
        }
    """, token)

    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'button[type="submit"]'))
    )
    submit_button.click()
    time.sleep(5)

except Exception as error:
    print(error)

finally:
    driver.quit()

使用 CapSolver SDK 求解 ImageToText

就像使用 API 一样,我们将继续使用该网站:
👉 https://captcha.com/demos/features/captcha-demo.aspx
验证码图像的 ID 为 demoCaptcha_CaptchaImage,结果输入字段的 ID 为 captchaCode

ImageToTextTask 中,您只需将 base64 编码的图像传递给 CapSolver。

示例代码:

python 复制代码
import time
import capsolver
import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

chrome_options = Options()
chrome_options.add_argument("--start-maximized")
service = Service(executable_path="chromedriver.exe")
driver = webdriver.Chrome(options=chrome_options, service=service)

# 设置您的 CapSolver 配置
api_key = "YOUR_API_KEY"
site_url = "https://captcha.com/demos/features/captcha-demo.aspx"
captcha_type = 'ImageToTextTask'
capsolver.api_key = api_key

try:
    driver.get(site_url)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#demoCaptcha_CaptchaImage'))
    )

    # 获取图像的 base64 字符串
    captcha_src = driver.execute_script("""
        const img = document.querySelector('img[id="demoCaptcha_CaptchaImage"]');
        return img ? img.getAttribute('src') : null;
    """)
    if not captcha_src:
        raise Exception("Unable to obtain captcha image!")

    base64_image = captcha_src.split(',')[1]
    solution = capsolver.solve({
        "type": captcha_type,
        "websiteURL": site_url,
        "body": base64_image,
    })
    captcha_text = solution["text"]
    print("Text:", captcha_text)

    driver.execute_script("""
        document.getElementById('captchaCode').value = arguments[0];
    """, captcha_text)

    validate_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, '#validateCaptchaButton'))
    )
    validate_button.click()
    time.sleep(5)

except Exception as error:
    print(error)

finally:
    driver.quit()

有用参考

展示 CapSolver 扩展程序的演示视频:

此外,CapSolver 还提供 开发者收入分成计划,允许开发者和合作伙伴通过集成或推广 CapSolver 解决方案来赚取佣金。这是一种有效获利的好方法,同时也能帮助其他人高效地解决验证码问题。有关完整详情,请查看:
CapSolver 开发者计划

结论

本指南向您展示了如何有效地将 SeleniumCapSolver 集成以处理验证码。我们介绍了 Selenium 用于 Web 自动化的核心功能,并重点介绍了两种主要的 CapSolver 集成方法:

  1. CapSolver 浏览器扩展程序:一种用于自动验证码求解的直接解决方案,非常适合快速设置。
  2. CapSolver API/SDK:提供更多控制和精度,非常适合高级用例。您可以在 此处 找到详细的 API 文档,以及在 此处 找到 Python SDK。

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

更多