4-验证码的识别【针对特定类型-->4种常见类型】--【重要!】

目前许多网站采用验证码来进行反爬虫!且花式越来越多!验证码最初是由几个数字的简单的图形验证码,后来加入英文字母和混淆曲线,设置还有中文字符的验证码,使得识别越来越难! 目前交互式验证码越来越多,如:极验滑动验证码需要滑动拼合滑块才可以完成验证,点触验证码需要完全点击正确结果才可以完成验证,另...
摘要由CSDN通过智能技术生成

目前许多网站采用验证码来进行反爬虫!且花式越来越多!验证码最初是由几个数字的简单的图形验证码,后来加入英文字母和混淆曲线,设置还有中文字符的验证码,使得识别越来越难!

目前交互式验证码越来越多,如:极验滑动验证码需要滑动拼合滑块才可以完成验证,点触验证码需要完全点击正确结果才可以完成验证,另外还有滑动宫格验证码、计算题验证码等。

本帖涉及的地验证码:普通验证码、极验滑动验证码、点触验证码、微博宫格验证码。这些验证码识别的方式和思路各有不同,了解这些之后,就差不多啦~~~

一、图形验证码的识别

图形验证码一般是由4位字母或者数字组成。比如:中国知网的注册如下图,网址:http://my.cnki.net/elibregister/commonRegister.aspx

2b497b3be2b5eb3d1758133a418644a6db1.jpg

措施:利用OCR技术识别图形验证码,需要安装tesserocr库。

#例子:现在保存一张验证码图片,命名为code.jpg,使用tesserocr库识别该验证码。

验证码图片为:b42b38aa0bb498fa852495ef68311332901.jpg

import tesserocr      
from PIL import Image

image=Image.open('code.jpg')
res=tesserocr.image_to_text(image)  #重要!
print(res)   #结果显示:  .1960

发现识别结果和实际情况有偏差,这是因为验证码内的多余线条干扰了图片的识别。需要对验证码图片进行额外的处理,如:灰度化、二值化等。

利用Image对象的convert()方法参数传入L,可将图片转化为灰度图像参数传入1,可将图片进行二值化处理

image=image.convert('L')  #灰度化
image=image.convert('1')  #二值化

还可以指定二值化的阈值。上面的方法(传入参数1)采用的是默认的阈值127。但是不能直接二值化原图,要先进行灰度化

image=image.convert('L')  #灰度化
threshold=127  #阈值
table=[]    
for i in range(256):
    if i<threshold:
        table.append(0)
    else:
        table.append(1)
image=image.point(table,'1')  #二值化  【自己设置阈值】   此时等价于  image.convert('1')
image.show()   #

此时原来验证码图片中的线条已经去除,整个验证码图片变得黑白分明。这是再利用tesserocr识别即可。

import tesserocr
from PIL import Image
image=Image.open('code.jpg')
image=image.convert('L')   #灰度化
threshold=100  #设置阈值
table=[]
for i in range(256):
    if i<threshold:
        table.append(0)
    else:
        table.append(1)
image=image.point(table,'1')  #二值化
res=tesserocr.image_to_text(image)
print(res)   #  J96C

图片验证码的识别成功!

总结:利用tesserocr识别验证码!若是验证码图片较为简单,就可以直接识别,但是若是较为复杂(有线条的干扰),需要对验证码图片进行预处理(灰度化、二值化)来提高识别的准确度。

二、极验滑动验证码的识别--->以极验证官方后台登录为例!

【极验验证码的这块知识:参考的是崔庆才作者的《Python3-网络爬虫开发实战》】

注:实际上现在很多的网站的极验验证码都是查找不到原始的验证码(不带缺口的图片)!但是我们要掌握这种方法的思路。

其需要拖动拼合滑块才可以验证,难!!!如图:e9a48d9f495070c2b579772d9b735e440bb.jpg

目标:用程序来识别并通过极验验证码的验证,包括:分析识别思路、识别缺口位置、生成滑动拖动路径、模拟实现滑块拼合通过验证等步骤。

工具:使用Selenium中的Chrome动态爬取。

识别思路:首先找到一个带有极验验证的网站,如:极验官方后台,链接:https://auth.geetest.com/login/。其是先点击d745defa89d58b7e3e6e6aa9207e395a5e6.jpg,再进行极验校正50019d6474aa86058094ef3d2c0ebd21aa9.jpg,验证成功之后会出现:d1b64800889923df983a7ef0c6d642c3b29.jpg

操作步骤:(1)模拟点击验证按钮   (2)识别滑动缺口的位置     (3)模拟拖动滑块

分析步骤:

第(1)步操作最简单,我们可以直接用Selenium模拟点击按钮

第(2)步操作识别缺口的位置比较关键,这里需要用到图像的相关处理方法。首先观察缺口的样子(见上图),缺口的四周边缘有明显的断裂边缘,边缘和边缘周围有明显的区别。我们可以实现一个边缘检测算法来找出缺口的位置。

对于极验验证码来说,我们可以利用和原图对比检测的方式来识别缺口的位置,因为在没有滑动滑块之前, 缺口并没有呈现。373564d284008c35b6fb2742a4aec260b62.jpg  6dd690517beaf0ce1fb802b15857b2767a2.jpg

获取两张图片。设定一个对比阔值,然后遍历两张图片,找出相同位置像素RGB差距超过此阔值的像素点,那么此像素点的位置就是缺口的位置

第(3)步操作看似简单,但其中的坑比较多。极验验证码增加了机器轨迹识别,匀速移动、随机速度移动等方法都不能通过验证,只有完全模拟人的移动轨迹才可以通过验证。人的移动轨迹一般是先加速后减速,需要模拟这个过程才能成功。

1、初始化

极验的管理后台登录页面:https://account.geetest.com/login。初始化一些配置,如Selenium 对象的初始化及一些参数的配置,如下:

EMAIL = 'pansy_nuist@163.com'
PASSWORD = '******************'  #自己的密码

class CrackGeetest():
    def __init__(self):
        self.url = 'https://account.geetest.com/login'
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser, 20)
        self.email = EMAIL
        self.password = PASSWORD

2、模拟点击

实现第1步的操作, 也就是模拟点击初始的验证按钮。利用显式等待的方法来实现,如下:

def get_geetest_button(self):
    """
    获取初始验证按钮
    :return:
    """
    button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
    return button

获取一个Web Element对象,调用它的click()方法即可模拟点击,代码如下所示:

button=
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用kaptcha依赖之前,你需要添加相应的依赖项。具体的添加步骤如下: 1. 首先,你需要导入kaptcha的依赖。在你的项目的pom.xml文件中,添加以下代码片段: ``` <!-- 案例2:katpcha,对应kaptcha目录案例 --> <dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency> ``` 2. 之后,你需要获取对应类型的captcha对象。在代码中,你可以使用类似以下的方式来获取captcha对象: ```java Captcha captcha = xxx; //获取对应类型的captcha对象 ``` 3. 最后,你可以使用以下三个方法来操作captcha对象: - 使用 `captcha.text()` 方法来获取验证码的结果内容。 - 使用 `captcha.toBase64()` 方法来获取验证码图片的base64编码。 - 使用 `captcha.out(response.getOutputStream())` 方法将验证码图片以流的形式返回给前端。 以上是关于使用kaptcha依赖的一些基本步骤和操作方法。希望能对你有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBoot业务开发 02、Springboot快速集成验证码【easy-captcha、kaptcha】超好看样式](https://blog.csdn.net/cl939974883/article/details/124132246)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值