【Python爬虫】图片验证码的处理

什么是图片验证码?

验证码(CAPTCHA)是"Completely Automated Public Turing test to tell Computers and HumansApart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机还是人的公共全自动程序。

图片验证码的处理方案

  1. 手动输入(input)这种方法仅限于登录一次就可持续使用的情况
  2. 图像识别引擎解析使用光学识别引擎处理图片中的数据,目前常用于图片数据提取,较少用于验证码处理
  3. 打码平台爬虫常用的验证码解决方案

图片识别引擎

OCR(Optical Character Recognition)是指使用扫描仪或数码相机对文本资料进行扫描成图像文件,然后对图像文件进行分析处理,自动识别获取文字信息及版面信息的软件。

什么是tesseract

Tesseract,一款由HP实验室开发由Google维护的开源OCR引擎,特点是开源,免费,支持多语言,多
平台。
项目地址:https:/github.com/tesseract-ocr/tesseract

图片识别引擎环境的安装

-mac环境下直接执行命令:brew install --with-training-tools tesseract

-windows环境下的安装可以通过exe安装包安装,下载地址:Home · UB-Mannheim/tesseract Wiki · GitHub
安装完成后记得将Tesseract 执行文件的目录加入到PATH中,方便后续调用。

配置教程:超详细解决pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in yo… - 简书 (jianshu.com)

  • 从第5步开始看
  • 其中第9步的修改py文件的文件路径在报错里可以找到(这个报错在下面的"使用代码"执行后可以得到)
  • 当然,如果配置成功就没有报错了

-linux环境下的安装:sudo apt-get install tesseract-ocr

Python库的安装

# PIL用于打开图片文件
pip install pillow
# pytesseract模块用于从图片中解析数据
pip install pytesseract

使用代码

# 图像识别引擎
from PIL import Image
import pytesseractim = Image.open("图片路径")
result = pytesseract.image_to_string(im)
print(result)

其他OCR平台

微软Azure 图像识别:https://azure.microsoft.com/zh-cn/services/cognitive-services/computer-vision/
阿里云图文识别:https://www.aliyun.com/product/cdi/
腾讯OCR文字识别:https://cloud.tencent.com/product/ocr

国内的识别引擎对于中文的支持会更好

常见的验证码的种类

url地址不变,验证码不变

这是验证码里面非常简单的一种类型,对应的只需要获取验证码的地址,然后请求,通过打码平台识别即可

url地址不变,验证码变化

这种验证码的类型是更加常见的一种类型,对于这种验证码,大家需要思考:在登录的过程中,假设我输入的验证码是对的,对方服务器是如何判断当前我输入的验证码是显示在我屏幕上的验证码,而不是其他的验证码呢?

在获取网页的时候,请求验证码,以及提交验证码的时候,对方服务器肯定通过了某种手段验证我之前获取的验证码和最后提交的验证码是同一个验证码,那这个手段是什么手段呢?

很明显,就是通过cookie来实现的,所以对应的,在请求页面,请求验证码,提交验证码的到时候需要保证cookie的一致性,对此可以使用requests.session来解决

打码平台——2Captcha的使用

笔者自己使用的,需要付费;可自行使用其他平台

网址:https://2captcha.com/zh

以下教程来源:Python验证码破解程序——在线识别验证码和2Captcha的Anti Captcha API

pip3 install 2captcha-python

TwoCaptcha类实例可按照如下方法创建:

from twocaptcha import TwoCaptchasolver = TwoCaptcha('YOUR_API_KEY')
# 您还能为已创建的实例设置选项:
config = {'server':           '2captcha.com','apiKey':           'YOUR_API_KEY','softId':            123,'callback':         'https://your.site/result-receiver','defaultTimeout':    120,'recaptchaTimeout':  600,'pollingInterval':   10,}
solver = TwoCaptcha(**config)

实例选项

选项默认值说明
服务器‘2captcha.com’API服务器。您可以将注册账户设置为‘rucaptcha.com’。
softId-您将在2Captcha软件目录发布后获得软件ID
回调函数-验证码识别结果会发送至网络服务器URL,但应先在账户的pingback设置中注册URL
defaultTimeout120除reCAPTCHA外的验证码的轮询超时时间(秒),用于判定模块尝试从res.phpAPI端点获得答案的时间
recaptchaTimeout600reCAPTCHA的轮询超时时间(秒),用于判定模块尝试从res.phpAPI端点获得答案的时间
pollingInterval10res.phpAPI端点发送请求的间隔时间(秒),不建议设置在5秒以内

重要提示:一旦回调函数确定用于TwoCaptcha实例,那么所有方法都只返回验证码ID,无法通过轮询API获得结果。结果将发送至回调URL。请通过getResult方法进行人工破解。

您在提交图片验证码时可提出额外选项,以便2Captcha的员工能够正确破解。

验证码选项

选项默认值说明
numeric0判定验证码是否由数字或其他符号组成,详情请见API文档。
minLength0最小答案长度
maxLength0最大答案长度
phrase0判定答案是否由多个词语组成
caseSensitive0判定答案是否区分大小写
calc0确定验证码需要计算
lang-确定验证码语言,见可用语言列表。
hintImg-所有验证码员工可见的提示图片
hintText-员工可见的验证码提示或任务文字

验证码类别

您可以利用以下方法绕过normal captcha(带有扭曲文字的图片)。这个方法也可用于识别图片上的任何文字。

result = solver.normal('path/to/captcha.jpg', param1=..., ...)

这种方法可用于绕过需要回答清晰文字问题的验证码。

result = solver.text('If tomorrow is Saturday, what day is today?', param1=..., ...)

此方法可破解reCAPTCHA V2,并获得令牌实现绕过保护。

result = solver.recaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/recaptcha',param1=..., ...)

此方法利可破解reCAPTCHA V3,并返回令牌。

result = solver.recaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/recaptcha',version='v3',param1=..., ...)

FunCaptcha(Arkoselabs)破解方法,并返回令牌。

result = solver.funcaptcha(sitekey='6Le-wvkSVVABCPBMRTvw0Q4Muexq1bi0DJwx_mJ-',url='https://mysite.com/page/with/funcaptcha',param1=..., ...)

此方法可破解GeeTest拼图验证码,并返回一组JSON格式的令牌。

result = solver.geetest(gt='f1ab2cdefa3456789012345b6c78d90e',challenge='12345678abc90123d45678ef90123a456b',url='https://www.site.com/page/',param1=..., ...)

此方法可破解hCaptcha,并返回可以绕过验证码的令牌。

result = solver.hcaptcha(sitekey='10000000-ffff-ffff-ffff-000000000001',url='https://www.site.com/page/', param1=..., ...)

通过令牌形式破解KeyCaptcha。

result = solver.keycaptcha(s_s_c_user_id=10,s_s_c_session_id='493e52c37c10c2bcdf4a00cbc9ccd1e8',s_s_c_web_server_sign='9006dc725760858e4c0715b835472f22-pz-',s_s_c_web_server_sign2='2ca3abe86d90c6142d5571db98af6714',url='https://www.keycaptcha.ru/demo-magnetic/', param1=..., ...)

以令牌形式绕过Capy拼图验证码。

result = solver.capy(sitekey='PUZZLE_Abc1dEFghIJKLM2no34P56q7rStu8v',url='http://mysite.com/',api_server='https://jp.api.capy.me/',param1=..., ...)

Grid法最初名为Old reCAPTCHA V2法,先在图中画好网格,点击特定网格框,以绕过任何类型的验证码。这种方法会返回方框数。

result = solver.grid('path/to/captcha.jpg', param1=..., ...)

Canvas法需要围着图中物体画一条线。这种方法会返回一组点坐标,用于绘制多边形。

result = solver.canvas('path/to/captcha.jpg', param1=..., ...)

ClickCaptcha会返回验证码图片的点坐标,若您需要点击图片的特定点,就可以使用这种方法。

result = solver.coordinates('path/to/captcha.jpg', param1=..., ...)

这种方法可破解需要旋转物体的验证码,主要用于绕过FunCaptcha。它会返回旋转角度。

result = solver.rotate('path/to/captcha.jpg', param1=..., ...)

一些方法&&操作

send / getResult

上述方法可用于人工提交验证码和答案轮询。

import time
. . . . . id = solver.send(file='path/to/captcha.jpg')
time.sleep(20)code = solver.get_result(id)

balance

以此方法获取账户余额:balance = solver.balance()

report

以此方法报告验证码答案之优劣。

solver.report(id, True) # captcha solved correctly
solver.report(id, False) # captcha solved incorrectly

如发生错误,验证码破解程序会提示异常。妥善处理这类情况很重要。我们推荐使用try/except来处理异常。

Try:result = solver.text('If tomorrow is Saturday, what day is today?')
Except ValidationException as e:# invalid parameters passedprint(e)
Except NetworkException as e:# network error occurredprint(e)
Except ApiException as e:# api respond with errorprint(e)
Except TimeoutException as e:# captcha is not solved so farprint(e)

代理

您可以将代理作为参数应用于以下方法:recaptcha、funcaptcha、geetest。代理将被转发至API以破解验证码。

proxy={'type': 'HTTPS','uri': 'login:password@IP_address:PORT'
}

异步回调

您也可以利用asyncio进行异步回调。

import asyncio
import concurrent.futures
from twocaptcha import TwoCaptchacaptcha_result = await captchaSolver(image)async def captchaSolver(image):loop = asyncio.get_running_loop()with concurrent.future.ThreadPoolExecutor() as pool:result = await loop.run_in_executor(pool, lambda: TwoCaptcha(API_KEY).normal(image))return result

使用selenium

完整教程请看:Selenium验证码求解器:如何使用反验证码2Captcha服务自动绕过reCAPTCHA、hCaptcha、Cloudflare、Arkose labs以及任何验证码

from selenium.webdriver.common.by import By
from twocaptcha import TwoCaptcha
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver# 实例化 WebDriver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))# 加载目标页面
captcha_page_url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.get(captcha_page_url)# 解决验证码问题
print("Solving Captcha")
solver = TwoCaptcha("2CAPTCHA_API_KEY")
response = solver.recaptcha(sitekey='SITE_KEY', url=captcha_page_url)
代码 = response['code']
print(f "Successfully solved the Captcha. The solve code is {code}")# 设置已解决的验证码
recaptcha_response_element = driver.find_element(By.ID, 'g-recaptcha-response')
driver.execute_script(f'arguments[0].value = "{code}";', recaptcha_response_element)# 提交表单
submit_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
submit_btn.click()# 暂停执行,以便在关闭驱动程序前查看提交后的屏幕情况
输入("按回车键继续")
driver.close()

2CAPTCHA_API_KEYSITE_KEY 替换为它们的值,然后运行代码,验证码将被破解,你将看到成功界面。

简单示例

from twocaptcha import TwoCaptcha
import timesolver = TwoCaptcha('your own key')
config = {'server':           '2captcha.com','apiKey':           'your own key','defaultTimeout':    120,'recaptchaTimeout':  600,'pollingInterval':   10,}
solver = TwoCaptcha(**config)
result = solver.normal('captcha.jpg', caseSensitive=1)
id = solver.send(file='captcha.jpg')
time.sleep(20)
code = solver.get_result(id)
print(code)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Markdown魔法手册:解锁高效写作的新技能

边使用边更新0.0... 文章目录 一、如何在Markdown中插入表情?二、文字样式设置1.文本颜色设置2.文本字号设置3.文本字体设置4. 实战演练5.黄色高亮 一、如何在Markdown中插入表情? 在Markdown中插入表情(emoji)的方法取决于你使用…

如何提升百度小程序的收录?百度小程序如何做优化?

​ 如何通过百度小程序获得更多的自然流量?这是做百度小程序肯定要考虑的问题,做百度小程序的目的就是想借助百度生态,做相应的关键词给自己的小程序引流,如何把流量给做起来呢,接下来我从不同的方面给大家进行分析讲解…

最新ChatGpt Desktop for Mac 安装使用教程

1. 下载地址 请点击链接下载 ChatGPT Desktop for MacOS 2. 使用要求 MacOS 版本 14需要时M1芯片的,如果你是因特尔的暂时还还不行 就算下载了也会出现下面的异常 3. 获取权限资格 目前 ChatGPT MacOS Desktop还不是全量开放的, 如果你没有收到通知说明你还没…

在 Dockerfile 中遇到了连接到 pypi.org 超时的问题

看起来你在 Dockerfile 中遇到了连接到 pypi.org 超时的问题。这可能是由于网络连接问题导致的。你可以尝试以下方法解决这个问题: 1. 更换镜像源: 有时候 pypi.org 的访问会受到地理位置或网络环境的影响,你可以考虑使用国内的镜像源来代…

Oracle的ROWID解析

目录 一、ROWID基础概念二、ROWID的类型三、ROWID的用途四、注意事项五、管理与监控 Oracle的ROWID是一个非常核心的概念,它代表了一行数据在数据库中的物理位置标识。 一、ROWID基础概念 唯一性与不变性:ROWID是每行数据的唯一标识符,它在行…

【Spark】调整hive表在HDFS存的每个文件的大小

配置参数: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

ipa 覆盖算法测试

相关文章 ipa 功能包测试 ipa 分区算法 ipa 分区算法总结,部分算法图解 ipa 覆盖算法分析(一) ipa 覆盖算法分析(二) 测试 网上找的地图: fig.1 测试地图 opencv fig.2 opencv 显示的覆盖路径 rviz fi…

6.定时器分时复用测量占空比

1.CUBEMAX配置 测量PA6,PA7输出的占空比,只需要把主要的配置,配置为A6口就行,A7口黄色表示配置不正确,不用管。 2.软件代码 TIME.c中找到TIM3的初始化,在后面初始化A7口 void MX_TIM3_Init_PA7(void) {/*…

创新实训2024.05.25日志:Web应用技术选型

我们的web应用使用python web的fastapi框架,通过uvicorn开启web服务。 1. refs 官网文档:FastAPI (tiangolo.com) github:https://github.com/tiangolo/fastapi 2. 环境配置 python:3.11 uvicorn:0.29.0 pip install "uvicorn[stan…

老外卖27刀每月的教程已经更新

用了两天半的时间,边学习,边整理了一份老外的视频教程,涉及Facebook,YouTube,tiktok等大的流量平台,有案例,有分析,有如何做。 这个教程是老外讲的,没有什么玄乎的塑造价…

理解矩阵内积与矩阵乘法的区别及其应用

文章目录 矩阵内积(逐元素乘积)矩阵内积的用途矩阵乘法(矩阵积)矩阵乘法的用途区别总结结论 在数据科学、机器学习、计算机图形学和图像处理等领域,矩阵运算是非常基础且重要的操作。然而,矩阵内积和矩阵乘…

【java程序设计期末复习】chapter3 运算符、表达式和语句

运算符、表达式和语句 Java提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符、位运算符等。 Java语言中的绝大多数运算符和C语言相同,基本语句,如条件分支语句、循环语句等也和C语言类似,因此,本章就主要知识…

聊聊ChatGPT的本质

这是鼎叔的第九十八篇原创文章。行业大牛和刚毕业的小白,都可以进来聊聊。 阶段性总结下我对ChatGPT的基础理解,算是一篇学习思考笔记吧。其中难免有很多不准确的,或过于简略的地方,将来再迭代学习。 OpenAI做ChatGPT的底层逻辑…

GitLab的原理及应用详解(六)

本系列文章简介: 随着软件开发的不断进步和发展,版本控制系统成为了现代软件开发过程中不可或缺的一部分。而GitLab作为其中一种流行的版本控制工具,在软件开发领域享有广泛的应用。GitLab不仅提供了强大的版本控制功能,还集成了项…

如何利用线程池实现互联网验证码保护服务

如何利用线程池实现互联网验证码保护服务 1、业务背景与实现思路2、代码实操1、业务背景与实现思路 首先介绍一下业务背景,假设我们的系统是一个短视频播放网站,每个新加入的用户都需要注册账号并绑定手机号。为了验证用户手机的正确性,我们的系统会发送一条验证码到用户注…

HBase到底是列式存储还是行式存储?

行存和列存 在行存储的数据库系统中,一行中的所有字段值都是连续存储的;在基于行存储的表中,即使只需要读取指定列时,也需要先将对应行的数据读取到内存,再过滤目标列,这样会导致过多的磁盘IO、内存和时间…

队列——链式存储

核心思路: 1、首先定义队列结点,包含数据域和指针域;然后定义链式队列,包含队列节点类型的队头和队尾指针。 2、初始化:     带头结点:给头结点分配内存,然后队头和队尾指针指向头结点&…

每日一题 字符串排序

目录 1.前言 2.题目解析 3.算法原理 4.代码实现 1.前言 在编程练习中,字符串的全排列问题是一个经典的算法问题。通过对字符串进行全排列,可以得到该字符串的所有可能的排列组合。本文将探讨如何对含有重复字符的字符串进行全排列,并且解决…

K8s的kubectl的基本操作

K8s的kubectl的基本操作 K8s基本信息的查看 查看版本信息 kubectl versio查看资源对象简写 kubectl api-resources查看集群信息 kubectl cluster-info配置kubectl自动补全 source <(kubectl completion bash)查看master节点状态 kubectl get cs查看命名空间 kubectl…