如何在 Selenium Python 中解决验证码 | 2024 完整指南

由于在进行网络自动化时遇到验证码是让许多人感到不知所措的问题。这些验证码专为区分人类用户和自动化脚本而设计,对于使用Selenium进行网络爬虫或自动化任务而言,无疑是一个巨大的挑战。2024年的完全指南将为您提供全面的解决方案,帮助您高效地应对这些障碍,尤其是两种常见的CAPTCHA类型,funcaptcha和recaptcha,当然我们还需要整合第三方CAPTCHA解决方案工具CapSolver。
目录
- 什么是CAPTCHA
- CAPTCHA示例
- 先决条件
- 方法1:通过Capsolver API解决CAPTCHA
- 理解HTML表单
- 处理隐藏的Textarea元素
- 获取Token
- 使用Capsolver Python SDK获取Token
- 在Selenium中使用Token
- 方法2:使用Capsolver扩展解决CAPTCHA
- 下载和重打包Capsolver扩展
奖励代码
领取您的奖励代码,用于顶级验证码解决方案;CapSolver:WEBS。兑换后,每次充值都将额外获得5%的奖励,无限次数。

什么是CAPTCHA
CAPTCHA要求用户执行特定任务,例如输入图像中显示的文本或点击符合特定标准的一组图像。这些任务旨在验证用户是人类还是机器人。由于这些任务的动态性质,只有通过人类认知和正确信息解释才能成功完成,这是人工智能常常遇到困难的领域。
某些CAPTCHA变体还支持视力受损的人士,通过生成音频而不是图像来进行验证。
CAPTCHA示例
Google的开源CAPTCHA小部件reCAPTCHA广泛使用,因为它支持各种主要的屏幕阅读器,如JAWS和NVDA,适用于Windows OS上的IE、Edge或Chrome,Chrome OS上的ChromeVox,以及Mac OS上的Safari和Chrome。

此外,FunCaptcha是另一种常见的CAPTCHA类型,用户需要点击特定的图像,例如选择所有包含特定对象的图像,以完成验证。正常的人类用户通常需要花费长达一分钟的时间来完成复杂的FunCaptcha验证。这两种类型的CAPTCHA有效地防止了自动化脚本攻击,并被许多网站广泛采用。

先决条件
- Google Chrome:安装最新版本的Chrome,因为我们将通过代码与Chrome进行交互。
- Python:确保已安装Python,并且版本为3或更高。不推荐使用3以下的版本。
- Selenium:Python的自动化工具Selenium的库。
- Capsolver Python SDK:官方Capsolver Python SDK,可轻松与Capsolver集成。
- Capsolver Extension:官方Capsolver Chrome扩展,可以自动为您解决各种挑战。
方法1:通过Capsolver API解决CAPTCHA
我们将使用此演示页面作为示例,演示如何在Python Selenium中使用Capsolver API解决reCAPTCHA。
理解HTML表单
在开始之前,我们需要了解HTML表单的基础知识。观察此页面并打开开发者工具。手动解决reCAPTCHA,然后点击提交按钮。您将看到发送的POST请求,提交了三个字段:ex-a、ex-b和g-recaptcha-response,如下图所示:

这三个字段对应于初始HTML源代码中表单下的两个输入元素和一个文本框元素,如下图所示:

我们的方法是使用Capsolver API解决reCAPTCHA,获取Token,将其输入到文本区域元素中,然后点击提交按钮以提交表单。
处理隐藏的Textarea元素
在将Token输入到文本区域元素时,请注意页面上的文本区域元素具有CSS样式display: none,这意味着文本区域是不可见的。在这种情况下,如果您尝试直接在Selenium中向文本区域元素输入内容,将会抛出错误:
selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable,因为此时文本区域元素是不可交互的。为了解决这个问题,我们需要将文本区域元素的CSS样式设置为display: block。具体的操作方法将在稍后的代码中体现。
获取Token
使用Capsolver API需要我们提供websiteKey,可以通过在页面源代码中搜索关键字data-sitekey来找到:

使用Capsolver Python SDK获取Token
以下是使用Capsolver Python SDK获取Token的方法:
import capsolvercapsolver.api_key = "your api key"
solution = capsolver.solve({"type": "ReCaptchaV2TaskProxyLess","websiteKey": "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9","websiteURL": "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php",
})
token = solution["gRecaptchaResponse"]
print(token)
在Selenium中使用Token
接下来,我们需要在Selenium中使用Token。在Selenium中有两个关键操作:
- 使文本区域元素可见,以便可以与之交互并将Token输入其中。
- 定位提交按钮并点击以提交表单。
这些操作涉及到元素的定位和交互。如果您对Selenium不太熟悉,可以参考使用Selenium和Python进行网页抓取 | 在网页抓取时解决CAPTCHA
结合Capsolver API,完整的代码如下所示:
import capsolver
from selenium import webdriver
from selenium.webdriver.common.by import By# 初始化Chrome选项对象并访问目标网站
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)
url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.get(url)# 调用Capsolver API解决ReCaptcha
capsolver.api_key = "your api key"
solution = capsolver.solve({"type": "ReCaptchaV2TaskProxyLess","websiteKey": "6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9","websiteURL": url,
})
token = solution["gRecaptchaResponse"]
print(f"Token returned by capsolver: {token}")# 修改Textarea的display样式属性为block,使其可见
driver.execute_script("document.getElementById('g-recaptcha-response').style.display = 'block';")
# 模拟向Textarea输入Token
textarea = driver.find_element(By.ID, "g-recaptcha-response")
textarea.send_keys(token)# 模拟点击并提交表单
submit_btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
submit_btn.click()
input("按任意键退出.")
driver.close()
以上代码演示了如何在Python Selenium中使用Capsolver API解决reCAPTCHA。成功解决后,您将看到以下页面:

方法2:使用Capsolver扩展解决CAPTCHA
方法1涉及使用Capsolver API解决CAPTCHA,包含许多复杂的操作。如果您正在寻找一种更简单、更方便的解决CAPTCHA的方式,那么Capsolver扩展是您的最佳选择。它可以轻松集成到Chrome和Firefox等浏览器中。Capsolver扩展可以自动识别并解决各种CAPTCHA挑战,无需任何人工干预,让您享受Capsolver的CAPTCHA解决服务,而无需编写任何代码。
我们以FunCaptcha为例,使用目标网页
下载和重新打包Capsolver扩展
由于我们在Selenium中使用Capsolver扩展,我们需要从Capsolver的官方GitHub下载zip文件。使用Capsolver扩展需要您在以下位置输入您的API密钥:

在Selenium中与浏览器扩展进行交互可能会非常麻烦,因此我们可以在扩展的配置文件中预填写API密钥,然后直接在Selenium中加载它。解压缩我们下载的Capsolver扩展zip文件,并在\assets\config.js文件中输入您的API密钥,如下图所示:

接下来,我们使用Chrome内置的扩展打包功能重新打包Capsolver扩展。请注意,您不能简单地将文件夹压缩回zip文件;这样的扩展是无法使用的。在Chrome中,访问chrome://extensions/,启用开发者模式,选择打包扩展选项,并导入整个Capsolver扩展文件夹。重新打包后,您将获得一个.crx文件。

在Selenium中使用Capsolver扩展
使用add_extension方法加载新打包的.crx格式Capsolver扩展。示例代码如下:
from selenium import webdriverchrome_options = webdriver.ChromeOptions()
chrome_options.add_extension(r"C:\path\to\CapSolver.Browser.Extension-chrome-v1.14.0.crx")
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://iframe.arkoselabs.com/3117BF26-4762-4F5A-8ED9-A85E69209A46/index.html")input("按任意键退出.")
driver.close()
运行代码,您将看到Capsolver扩展自动解决FunCaptcha挑战:

CapsolverCN官 方代理交流扣 群:497493756
结论
无论是使用Capsolver API还是Capsolver扩展,您都可以在Python Selenium中完美解决CAPTCHA问题。如有任何疑问,请参考Capsolver文档获取更多有用信息。
相关文章:
如何在 Selenium Python 中解决验证码 | 2024 完整指南
由于在进行网络自动化时遇到验证码是让许多人感到不知所措的问题。这些验证码专为区分人类用户和自动化脚本而设计,对于使用Selenium进行网络爬虫或自动化任务而言,无疑是一个巨大的挑战。2024年的完全指南将为您提供全面的解决方案,帮助您高…...
ASCII码对照表【2024年汇总】
🍺ASCII相关文章汇总如下🍺: 🎈ASCII码对照表(255个ascii字符汇总)🎈🎈ASCII码对照表(Unicode 字符集列表)🎈🎈ASCII码对照表&#x…...
刷题之买股票的最佳时机(leetcode)
买股票的最佳时机 动态规划入门题。 最简单的模拟式解法: class Solution { public:int maxProfit(vector<int>& prices) {//也可以换一种思路,因为只交易一次,那么找出股票最便宜的时候买入,最贵的时候卖出ÿ…...
Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题 透过源码解决SeataAT…...
1.2 如何让机器说人话?万字长文回顾自然语言处理(NLP)的前世今生 —— 《带你自学大语言模型》系列
本系列目录 《带你自学大语言模型》系列部分目录及计划,完整版目录见:带你自学大语言模型系列 —— 前言 第一部分 走进大语言模型(科普向) 第一章 走进大语言模型 1.1 从图灵机到GPT,人工智能经历了什么࿱…...
【QT】按钮类控件
按钮类控件 按钮类控件1. PushButton2. Radio Button3. Check Box4. Tool Button 按钮类控件 1. PushButton 使⽤ QPushButton 表示⼀个按钮,这也是当前我们最熟悉的⼀个控件了. QPushButton 继承⾃ QAbstractButton . 这个类是⼀个抽象类. 是其他按钮的⽗类. 在…...
RedHat运维-Linux软件包管理基础-RHEL9软件包管理基础
Linux软件包管理基础-RHEL9 1. 对于RHEL9来说,软件包管理基础分为增、删、改、查四个部分。对于增来说,有:增加一个仓库的信息文件、启用一个仓库的信息文件、安装rpm包、解压rpm包、安装软件、安装软件组、更新软件。在这里先讲软件包管理中…...
uniapp----- 判断小程序版本有没有更新
const updateManager uni.getUpdateManager();// 当向小程序后台请求完新版本信息,会进行回调updateManager.onCheckForUpdate(function (res) {console.log(是否有新版本, res.hasUpdate);});// 当新版本下载完成,会进行回调updateManager.onUpdateRea…...
Spring Boot的无缝衔接:深入解析与实践
欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 🚀The begin🚗点点关注,收藏不迷路🚩 引言 在快速迭代的软件开发环境中,无缝衔接是提升开发效率、降低维护成本、增强系统稳定性的关键。Spring Boo…...
在Linux上查找文件的2个好用的命令
在Linux上查找文件,两个非常好用的命令是find和locate。 find命令 find命令非常强大,可以在指定目录下查找符合条件的文件。你可以根据文件名、文件类型、大小、修改日期等多种条件来查找文件。例如,要在当前目录及其子目录下查找所有扩展名…...
实现WebSocket聊天室功能
实现WebSocket聊天室功能 什么是WebSocket?WebSocket的工作原理服务器端实现客户端实现 在现代Web开发中,实时通信已经变得越来越重要。传统的HTTP协议由于其无状态和单向通信的特点,无法很好地满足实时通信的需求。而WebSocket协议则应运而生…...
qt opencv 应用举例
在Qt中使用OpenCV可以实现各种图像处理和计算机视觉任务。以下是一些Qt与OpenCV联合应用的具体举例: 1. 图像读取与显示 读取图像:使用OpenCV的imread函数可以方便地读取各种格式的图像文件,如.bmp、.jpg、.png等。这个函数返回一个Mat对象…...
QT5.12环境搭建与源码编译
一、概述 QT版本:QT5.12.10 Qt网址:http://download.qt.io/archive/qt/ 编译平台 ubuntu18.04 二、安装交叉编译工具链 1、获取交叉编译工具链 一般如果是编译系统如果有对应的gcc 就是用这个就可以了 比如rk3128 lin…...
Android中android.fg线程和android.ui线程分别代表什么?
Android中android.fg线程和android.ui线程分别代表什么? android.fg线程(FgThread): FgThread是Android系统中一个特殊的线程,其类定义大致为public final class FgThread extends ServiceThread。它主要用于提供一个…...
MATLAB 2024b 更新了些什么?
MATLAB 2024b版本已经推出了预览版,本期介绍一些MATLAB部分的主要的更新内容。 帮助浏览器被移除 在此前的版本,当我们从MATLAB中访问帮助文档时,默认会通过MATLAB的帮助浏览器(Help browser)。 2024b版本开始&…...
SSM高校教师教学质量评估系统-计算机毕业设计源码03344
摘要 在高等教育中,教学质量是培养优秀人才的关键。为了提高教学质量,高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架,旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架,具…...
【Linux进阶】文件系统5——ext2文件系统(inode)
1.再谈inode (1) 理解inode,要从文件储存说起。 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。操作系统读取硬盘的时候,不会一个个…...
华为云简介
前言 华为云是华为的云服务品牌,将华为30多年在ICT领域的技术积累和产品解决方案开放给客户,致力于提供稳定可靠、安全可信、可持续创新的云服务,赋能应用、使能数据、做智能世界的“黑土地”,推进实现“用得起、用得好、用得放心…...
Doris数据库---建表、调整表结构操作
一、简介 本文章主讲创建 Doris 自维护的表的语法,以下为本人最近为数据中台接入doris所踩的坑及其解决方案,欢迎点评。 二、doris建表语法: 官网建表语法网址链接:CREATE-TABLE - Apache Doris 官网建表语法如图所示…...
《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》
《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》 活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 计算机视觉-图像分类,很感兴趣 且今日精神颇佳,一个字,学啊 上一节&…...
STM32+rt-thread判断是否联网
一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权
摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题:安全。文章将详细阐述认证(Authentication) 与授权(Authorization的核心概念,对比传统 Session-Cookie 与现代 JWT(JS…...
Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
