python自动化操作之动态验证码、滑动验证码的降噪和识别


Posted in Python onAugust 30, 2021

前言

python对动态验证码、滑动验证码的降噪和识别,在各种自动化操作中,我们经常要遇到沿跳过验证码的操作,而对于验证码的降噪和识别,的确困然了很多的人。这里我们就详细讲解一下不同验证码的降噪和识别。

一、动态验证码 

  • 动态验证码是服务端生成的,点击一次,就会更换一次,这就会造成很多人在识别的时候,会发现验证码一直过期
  • 这是因为,如果你是把图片下载下来,进行识别的话,其实在下载的这个请求中,其实相当于点击了一次,这个验证码的内容已经被更换了
  • 最好的方法是,打开这个页面后,将页面进行截图,然后定位到验证码的位置,将验证码从截图上面裁剪下来进行识别,这样就不会造成多次请求,验证码更换的情况了

python自动化操作之动态验证码、滑动验证码的降噪和识别

from selenium import webdriver
from PIL import Image
 
# 实例化浏览器
driver = webdriver.Chrome()
 
# 最大化窗口
driver.maximize_window()
 
# 打开登陆页面
driver.get(# 你的url地址)
 
# 保存页面截图
driver.get_screenshot_as_file('./screen.png')
 
# 定位验证码的位置
location = driver.find_element_by_id('login_yzm_img').location
size = driver.find_element_by_id('login_yzm_img').size
left = location['x']
top =  location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']
 
# 裁剪保存
img = Image.open('./screen.png').crop((left,top,right,bottom))
img.save('./code.png')
 
driver.quit()

二、滑动验证码

  • 滑动验证码,通常是两个滑块图片,将小图片滑动到大图片上的缺口位置,进行重合,即可通过验证
  • 对于滑动验证码,我们就要识别大图上面的缺口位置,然后让小滑块滑动响应的位置距离,即可
  • 而为了让你滑动起来,更加的拟人化,你需要一个滑动的路径,模拟人为去滑动,而不是机器去滑动

python自动化操作之动态验证码、滑动验证码的降噪和识别

# 下载两个滑块
bg = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[1]').get_attribute('src')
slider = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[2]').get_attribute('src')
 
request.urlretrieve(bg, os.getcwd() + '/bg.png')
request.urlretrieve(slider, os.getcwd() + '/slider.png')
 
 
# 获取两个滑块偏移量方法
def getGap(self, sliderImage, bgImage):
    '''
    Get the gap distance
    :param sliderImage: the image of slider
    :param bgImage: the image of background
    :return: int
    '''
    bgImageInfo = cv2.imread(bgImage, 0)
    bgWidth, bgHeight = bgImageInfo.shape[::-1]
    bgRgb = cv2.imread(bgImage)
    bgGray = cv2.cvtColor(bgRgb, cv2.COLOR_BGR2GRAY)
 
    slider = cv2.imread(sliderImage, 0)
    sliderWidth, sliderHeight = slider.shape[::-1]
 
    res = cv2.matchTemplate(bgGray, slider, cv2.TM_CCOEFF)
    a, b, c, d = cv2.minMaxLoc(res)
    # print(a,b,c,d)
    # 正常如下即可
    # return c[0] if abs(a) >= abs(b) else d[0]
    # 但是头条显示验证码的框跟验证码本身的像素不一致,所以需要根据比例计算
    if abs(a) >= abs(b):
        return c[0] * bgWidth / (bgWidth - sliderWidth)
    else:
        return d[0] * bgWidth / (bgWidth - sliderWidth)
 
# 移动路径方法
def getTrack(self, distance):
    '''
    Get the track by the distance
    :param distance: the distance of gap
    :return: list
    '''
    # 移动轨迹
    track = []
    # 当前位移
    current = 0
    # 减速阈值
    mid = distance * 4 / 5
    # 计算间隔
    t = 0.2
    # 初速度
    v = 0
 
    while current < distance:
        if current < mid:
            # 加速度为正2
            a = 2
        else:
            # 加速度为负3
            a = -3
        # 初速度v0
        v0 = v
        # 当前速度v = v0 + at
        v = v0 + a * t
        # 移动距离x = v0t + 1/2 * a * t^2
        move = v0 * t + 1 / 2 * a * t * t
        # 当前位移
        current += move
        # 加入轨迹
        track.append(round(move))
    return track
 
 
# 滑动到缺口位置
def moveToGap(self, track):
    '''
    Drag the mouse to gap
    :param track: the track of mouse
    :return: None
    '''
    ActionChains(self.driver).click_and_hold(self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[3]/div[2]/div[2]/div')).perform()
    while track:
        x = random.choice(track)
        ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
        track.remove(x)
    time.sleep(0.5)
    ActionChains(self.driver).release().perform()

三、验证码的降噪

验证码的降噪,只是为了处理验证码图像上的多余的线条和干扰线,让你后期识别更加的准确,提高识别的准确度

第一步:可以进行灰度转化

python自动化操作之动态验证码、滑动验证码的降噪和识别

python自动化操作之动态验证码、滑动验证码的降噪和识别

img = cv2.imread('yzm.png')
# 将图片灰度化处理,降维,加权进行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('min_gray',gray)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

第二步: 二值化处理

python自动化操作之动态验证码、滑动验证码的降噪和识别

import cv2
 
img = cv2.imread('yzm.png')
# 将图片灰度化处理,降维,加权进行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
 
cv2.imshow('threshold',gray2)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

第三步:噪点过滤

python自动化操作之动态验证码、滑动验证码的降噪和识别

import cv2
 
img = cv2.imread('yzm.png')
# 将图片灰度化处理,降维,加权进行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
 
def remove_noise(img, k=4):
    img2 = img.copy()
 
    #     img处理数据,k过滤条件
    w, h = img2.shape
 
    def get_neighbors(img3, r, c):
        count = 0
        for i in [r - 1, r, r + 1]:
            for j in [c - 1, c, c + 1]:
                if img3[i, j] > 10:  # 纯白色
                    count += 1
        return count
 
    #     两层for循环判断所有的点
    for x in range(w):
        for y in range(h):
            if x == 0 or y == 0 or x == w - 1 or y == h - 1:
                img2[x, y] = 255
            else:
                n = get_neighbors(img2, x, y)  # 获取邻居数量,纯白色的邻居
                if n > k:
                    img2[x, y] = 255
    return img2
 
 
result = remove_noise(gray2)
cv2.imshow('8neighbors', result)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

四、验证码的识别

通常我们会使用tesserocr识别验证码,但是这个库有很大的局限性,识别率低,即时降噪效果很好,有很少的线条,也会不准确,这种识别方式并不十分推荐

所以我们一般会使用第三方的接口进行识别,比如阿里的图片识别、腾讯也都是有的

这些第三方接口需要自己接入识别接口

#识别降噪后的图片
code = tesserocr.image_to_text(nrImg)
 
#消除空白字符
code.strip()
 
#打印
print(code)

总结

到此这篇关于python自动化操作之动态验证码、滑动验证码的降噪和识别的文章就介绍到这了,更多相关python动态验证码降噪和识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python 过滤字符串的技巧,map与itertools.imap
Sep 06 Python
Python实现的ini文件操作类分享
Nov 20 Python
Python os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Python模块文件结构代码详解
Feb 03 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
数组保存为txt, npy, csv 文件, 数组遍历enumerate的方法
Jul 09 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python获取url的返回信息方法
Dec 17 Python
pandas去除重复列的实现方法
Jan 29 Python
Python 运行.py文件和交互式运行代码的区别详解
Jul 02 Python
用Python 执行cmd命令
Dec 18 Python
Python图片验证码降噪和8邻域降噪
Aug 30 #Python
Python音乐爬虫完美绕过反爬
Aug 30 #Python
详解解Django 多对多表关系的三种创建方式
Aug 23 #Python
一些让Python代码简洁的实用技巧总结
Aug 23 #Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 23 #Python
Python学习开发之图形用户界面详解
Aug 23 #Python
利用Python读取微信朋友圈的多种方法总结
Aug 23 #Python
You might like
环境会对咖啡种植有什么影响
2021/03/03 咖啡文化
php ob_flush,flush在ie中缓冲无效的解决方法
2010/05/09 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
thinkPHP自动验证、自动添加及表单错误问题分析
2016/10/17 PHP
php微信开发之自定义菜单实现
2016/11/18 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
DOM 中的事件处理介绍
2012/01/18 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
基于JavaScript实现弹出框效果
2016/02/19 Javascript
js实现目录链接,内容跟着目录滚动显示的简单实例
2016/10/15 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
常用的js方法合集
2017/03/10 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
基于jQuery ztree实现表格风格的树状结构
2018/08/31 jQuery
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
微信小程序实现点击效果
2019/06/21 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
js实现随机点名程序
2020/09/17 Javascript
vue使用swiper实现中间大两边小的轮播图效果
2019/11/24 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
2020/08/25 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python函数与方法的区别总结
2019/06/23 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
2020/04/15 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
Django后端按照日期查询的方法教程
2021/02/28 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
nohup的用法
2012/11/26 面试题
触电现场处置方案
2014/05/14 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
民主生活会意见
2015/06/05 职场文书
休学证明范本
2015/06/19 职场文书
2016年党员干部公开承诺书
2016/03/24 职场文书
担保书范文
2019/07/09 职场文书