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. 安装
# 安装 DrissionPagepipinstallDrissionPage# 安装 requests 库,用于调用 CapSolver APIpipinstallrequests2.3. 基本用法示例
fromDrissionPageimportChromiumPage# 创建浏览器实例page=ChromiumPage()# 导航到 URLpage.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 函数:
importtimeimportrequestsfromDrissionPageimportChromiumPage CAPSOLVER_API_KEY="YOUR_API_KEY"CAPSOLVER_API="https://api.capsolver.com"defcreate_task(task_payload:dict)->str:"""创建验证码解决任务并返回任务 ID。"""response=requests.post(f"{CAPSOLVER_API}/createTask",json={"clientKey":CAPSOLVER_API_KEY,"task":task_payload})result=response.json()ifresult.get("errorId")!=0:raiseException(f"CapSolver error:{result.get('errorDescription')}")returnresult["taskId"]defget_task_result(task_id:str,max_attempts:int=120)->dict:"""轮询任务结果,直到解决或超时。"""for_inrange(max_attempts):response=requests.post(f"{CAPSOLVER_API}/getTaskResult",json={"clientKey":CAPSOLVER_API_KEY,"taskId":task_id})result=response.json()ifresult.get("status")=="ready":returnresult["solution"]elifresult.get("status")=="failed":raiseException(f"Task failed:{result.get('errorDescription')}")time.sleep(1)raiseTimeoutError("CAPTCHA solving timed out")defsolve_captcha(task_payload:dict)->dict:"""完成验证码解决工作流。"""task_id=create_task(task_payload)returnget_task_result(task_id)4.2. 浏览器扩展集成
您也可以使用 CapSolver 浏览器扩展配合 DrissionPage,实现更“无感”的自动化解决。
4.2.1. 安装步骤
- 从 capsolver.com/en/extension 下载 CapSolver 扩展。
- 解压扩展文件。
- 配置 API 密钥:编辑扩展文件夹中的
config.js文件,填入您的 API 密钥。
// 在扩展文件夹中,编辑: assets/config.jsvardefined={apiKey:"YOUR_CAPSOLVER_API_KEY",// 替换为您的实际 API 密钥enabledForBlacklistControl:false,blackUrlList:[],enabledForRecaptcha:true,enabledForRecaptchaV3:true,enabledForTurnstile:true,// ... 其他设置}- 将其加载到 DrissionPage 中:
fromDrissionPageimportChromiumPage,ChromiumOptions co=ChromiumOptions()co.add_extension('/path/to/capsolver-extension')page=ChromiumPage(co)# 扩展程序将自动检测并解决验证码注意:扩展程序必须配置有效的 API 密钥才能自动解决验证码。
5. 典型代码示例
5.1. 解决 Cloudflare Turnstile
Cloudflare Turnstile 是最常见的验证码挑战之一。以下是解决它的方法:
importtimeimportrequestsfromDrissionPageimportChromiumPage CAPSOLVER_API_KEY="YOUR_API_KEY"CAPSOLVER_API="https://api.capsolver.com"defsolve_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()ifresult.get("errorId")!=0:raiseException(f"Error:{result.get('errorDescription')}")task_id=result["taskId"]# 轮询结果whileTrue:result=requests.post(f"{CAPSOLVER_API}/getTaskResult",json={"clientKey":CAPSOLVER_API_KEY,"taskId":task_id}).json()ifresult.get("status")=="ready":returnresult["solution"]["token"]elifresult.get("status")=="failed":raiseException(f"Failed:{result.get('errorDescription')}")time.sleep(1)defmain():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 注入 tokenpage.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,无需手动配置:
importtimeimportrequestsfromDrissionPageimportChromiumPage,ChromiumOptions CAPSOLVER_API_KEY="YOUR_API_KEY"CAPSOLVER_API="https://api.capsolver.com"defsolve_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()ifresult.get("errorId")!=0:raiseException(f"Error:{result.get('errorDescription')}")task_id=result["taskId"]print(f"Task created:{task_id}")# 轮询结果whileTrue:result=requests.post(f"{CAPSOLVER_API}/getTaskResult",json={"clientKey":CAPSOLVER_API_KEY,"taskId":task_id}).json()ifresult.get("status")=="ready":returnresult["solution"]["gRecaptchaResponse"]elifresult.get("status")=="failed":raiseException(f"Failed:{result.get('errorDescription')}")time.sleep(1)defmain():# 只需提供 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 Keyrecaptcha_div=page('.g-recaptcha')ifnotrecaptcha_div:print("No reCAPTCHA found on page!")returnsite_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]}...")# 注入 tokenpage.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')orpage('input[type="submit"]')orpage('button[type="submit"]')ifsubmit_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 的动作链提供了自然的鼠标移动和键盘输入,进一步增强了反检测能力:
importtimeimportrandomfromDrissionPageimportChromiumPagefromDrissionPage.commonimportKeys,Actionsdefhuman_delay():"""随机延迟以模拟人类行为。"""time.sleep(random.uniform(0.5,1.5))defmain():page=ChromiumPage()page.get('https://your-target-site.com/form')# 使用动作链进行类人交互ac=Actions(page)# 自然地移动到输入框,然后点击并输入ac.move_to('input[name="email"]').click()human_delay()# 像人类一样缓慢输入forcharin"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 以使其更像一个常规浏览器:
fromDrissionPageimportChromiumPage,ChromiumOptions co=ChromiumOptions()# 禁用 WebDriver 特征co.set_argument('--disable-blink-features=AutomationControlled')co.set_argument('--no-sandbox')# 设置常见的 User-Agentco.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. 随机延迟与限速
通过添加随机延迟来避免触发网站的速率限制:
importrandomimporttimedefhuman_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. 错误处理与重试机制
始终为验证码解决实现适当的错误处理和重试逻辑:
defsolve_with_retry(task_payload:dict,max_retries:int=3)->dict:"""带重试逻辑的验证码解决函数。"""forattemptinrange(max_retries):try:returnsolve_captcha(task_payload)exceptTimeoutError:ifattempt<max_retries-1:print(f"Timeout, retrying... ({attempt+1}/{max_retries})")time.sleep(5)else:raiseexceptExceptionase:if"balance"instr(e).lower():raise# 余额错误不重试ifattempt<max_retries-1:time.sleep(2)else:raise7. 总结
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