python 对动态验证码、滑动验证码的降噪和识别(1)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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()



#### 二、滑动验证码


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


![](https://img-blog.csdnimg.cn/20210827125929932.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBAYXV0b2ZlbGl4,size_19,color_FFFFFF,t_70,g_se,x_16)



下载两个滑块

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()



#### 三、验证码的降噪


* 验证码的降噪,只是为了处理验证码图像上的多余的线条和干扰线,让你后期识别更加的准确,提高识别的准确度
* 第一步:可以进行灰度转化


![](https://img-blog.csdnimg.cn/20210827131538945.png)


![](https://img-blog.csdnimg.cn/20210827131751538.png)



img = cv2.imread(‘yzm.png’)

将图片灰度化处理,降维,加权进行灰度化c

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow(‘min_gray’,gray)

cv2.waitKey(0)
cv2.destroyAllWindows()


* 第二步: 二值化处理


![](https://img-blog.csdnimg.cn/20210827131932573.png)



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()


* 第三步:噪点过滤


![](https://img-blog.csdnimg.cn/20210827132057431.png)



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)

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值