
1. 引言:自动化面临的挑战
在数据采集、自动化测试和业务运营等领域,Web 自动化已成为不可或缺的工具。然而,现代网站部署了日益复杂的反爬虫机制和验证码(CAPTCHA),这使得即使是精心设计的自动化脚本也可能功亏一篑。
DrissionPage 与 CapSolver 的强强联合,为解决这一难题提供了强大的解决方案:
- DrissionPage :一个基于 Python 的 Web 自动化工具,它能控制 Chromium 浏览器,但无需依赖 WebDriver,从而有效规避了常见的 WebDriver 检测。它将浏览器自动化与 HTTP 请求能力融为一体。
- CapSolver:一个由 AI 驱动的验证码自动识别服务,能够处理 Cloudflare Turnstile、reCAPTCHA 等多种复杂验证码。
通过结合使用,这两个工具能够实现无缝的 Web 自动化,同时绕过 WebDriver 检测和验证码挑战。
1.1. 集成目标
本指南旨在帮助您实现以下三个核心目标:
- 规避 WebDriver 检测:利用 DrissionPage 的原生浏览器控制能力,避免暴露 Selenium/WebDriver 的特征。
- 自动解决验证码:集成 CapSolver 的 API,实现验证码挑战的自动处理,无需人工干预。
- 模拟人类行为:结合 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 入门
- 在 capsolver.com 注册账户。
- 为您的账户充值。
- 从控制台获取您的 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. 安装步骤
- 从 capsolver.com/en/extension 下载 CapSolver 扩展。
- 解压扩展文件。
- 配置 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,
// ... 其他设置
}
- 将其加载到 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. 总结
DrissionPage 和 CapSolver 的集成,为 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
