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中针对函数处理的特殊方法
Mar 06 Python
Python变量和字符串详解
Apr 29 Python
python脚本生成caffe train_list.txt的方法
Apr 27 Python
python numpy实现文件存取的示例代码
May 26 Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 Python
利用python Selenium实现自动登陆京东签到领金币功能
Oct 31 Python
python的range和linspace使用详解
Nov 27 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
python中 _、__、__xx__()区别及使用场景
Jun 30 Python
python 读txt文件,按‘,’分割每行数据操作
Jul 05 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
pycharm中选中一个单词替换所有重复单词的实现方法
Nov 17 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 mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
JavaScript检测上传文件大小的方法
2015/07/22 Javascript
利用JavaScript阻止表单提交的两种方法
2016/08/11 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
js使用ajax传值给后台,后台返回字符串处理方法
2018/08/08 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
vue+Element-ui实现分页效果实例代码详解
2018/12/10 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Windows下搭建python开发环境详细步骤
2020/07/20 Python
python+Django+apache的配置方法详解
2016/06/01 Python
python学生管理系统开发
2019/01/30 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
用python求一个数组的和与平均值的实现方法
2019/06/29 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
pytorch随机采样操作SubsetRandomSampler()
2020/07/07 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
英国女装网上商店:I Saw It First
2018/10/18 全球购物
Footshop法国:购买运动鞋
2020/01/19 全球购物
ktv收银员岗位职责
2013/12/16 职场文书
廉洁使者实施方案
2014/03/29 职场文书
好学生评语大全
2014/05/05 职场文书
节能宣传周活动总结
2014/05/08 职场文书
2014年银行柜员工作总结
2014/11/12 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
python内置模块之上下文管理contextlib
2022/06/14 Python