python自动化操作之动态验证码、滑动验证码的降噪和识别
目录
- 前言
- 一、动态验证码
- 二、滑动验证码
- 三、验证码的降噪
- 四、验证码的识别
- 总结
前言 python对动态验证码、滑动验证码的降噪和识别,在各种自动化操作中,我们经常要遇到沿跳过验证码的操作,而对于验证码的降噪和识别,的确困然了很多的人。这里我们就详细讲解一下不同验证码的降噪和识别。
一、动态验证码
- 动态验证码是服务端生成的,点击一次,就会更换一次,这就会造成很多人在识别的时候,会发现验证码一直过期
- 这是因为,如果你是把图片下载下来,进行识别的话,其实在下载的这个请求中,其实相当于点击了一次,这个验证码的内容已经被更换了
- 最好的方法是,打开这个页面后,将页面进行截图,然后定位到验证码的位置,将验证码从截图上面裁剪下来进行识别,这样就不会造成多次请求,验证码更换的情况了

文章图片
from selenium import webdriverfrom 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').locationsize = driver.find_element_by_id('login_yzm_img').sizeleft = 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()
二、滑动验证码
- 滑动验证码,通常是两个滑块图片,将小图片滑动到大图片上的缺口位置,进行重合,即可通过验证
- 对于滑动验证码,我们就要识别大图上面的缺口位置,然后让小滑块滑动响应的位置距离,即可
- 而为了让你滑动起来,更加的拟人化,你需要一个滑动的路径,模拟人为去滑动,而不是机器去滑动

文章图片
# 下载两个滑块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:# 加速度为正2a = 2else:# 加速度为负3a = -3# 初速度v0v0 = v# 当前速度v = v0 + atv = v0 + a * t# 移动距离x = v0t + 1/2 * a * t^2move = 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()
三、验证码的降噪 验证码的降噪,只是为了处理验证码图像上的多余的线条和干扰线,让你后期识别更加的准确,提高识别的准确度
第一步:可以进行灰度转化

文章图片

文章图片
img = cv2.imread('yzm.png')# 将图片灰度化处理,降维,加权进行灰度化cgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)cv2.imshow('min_gray',gray) cv2.waitKey(0)cv2.destroyAllWindows()
第二步: 二值化处理

文章图片
import cv2 img = cv2.imread('yzm.png')# 将图片灰度化处理,降维,加权进行灰度化cgray = 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()
第三步:噪点过滤

文章图片
import cv2 img = cv2.imread('yzm.png')# 将图片灰度化处理,降维,加权进行灰度化cgray = 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 = 0for i in [r - 1, r, r + 1]:for j in [c - 1, c, c + 1]:if img3[i, j] > 10:# 纯白色count += 1return 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] = 255else:n = get_neighbors(img2, x, y)# 获取邻居数量,纯白色的邻居if n > k:img2[x, y] = 255return 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动态验证码降噪和识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- MongoDB,Wondows下免安装版|MongoDB,Wondows下免安装版 (简化版操作)
- python学习之|python学习之 实现QQ自动发送消息
- 逻辑回归的理解与python示例
- python自定义封装带颜色的logging模块
- 在线版的迅捷思维导图怎么操作()
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- Python基础|Python基础 - 练习1
- 操作系统|[译]从内部了解现代浏览器(1)
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)