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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
python网络编程学习笔记(二):socket建立网络客户端
Jun 09 Python
python中的sort方法使用详解
Jul 25 Python
Python中functools模块函数解析
Mar 12 Python
Python工程师面试必备25条知识点
Jan 17 Python
Python文本处理之按行处理大文件的方法
Apr 09 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
Jun 04 Python
Python处理时间日期坐标轴过程详解
Jun 25 Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 Python
PyTorch 导数应用的使用教程
Aug 31 Python
PyCharm最新激活码PyCharm2020.2.3有效
Nov 18 Python
Python+Pillow+Pytesseract实现验证码识别
May 11 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
用php来检测proxy
2006/10/09 PHP
其他功能
2006/10/09 PHP
PHP的explode和implode的使用说明
2011/07/17 PHP
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
JavaScript语言精粹经典实例(整理篇)
2016/06/07 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
vue组件间通信六种方式(总结篇)
2019/05/15 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
js实现移动端轮播图滑动切换
2020/12/21 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python enumerate索引迭代代码解析
2018/01/19 Python
Python中使用__new__实现单例模式并解析
2019/06/25 Python
使用python实现时间序列白噪声检验方式
2020/06/03 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
海淘零差价,宝贝全球购: 宝贝格子
2016/08/24 全球购物
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
1688平价精选商城:阿里集团旗下,工厂出厂价格直销
2017/04/24 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
党员示范岗材料
2014/12/19 职场文书
大学生个人总结范文
2015/02/15 职场文书
工作自我推荐信范文
2015/03/25 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Java设计模式之代理模式
2022/04/22 Java/Android