👍【AI机器学习入门与实战】目录
🍭基础篇
🔥 第一篇:【AI机器学习入门与实战】AI 人工智能介绍
🔥 第二篇:【AI机器学习入门与实战】机器学习核心概念理解
🔥 第三篇:【AI机器学习入门与实战】机器学习算法都有哪些分类?
🔥 第四篇:【AI机器学习入门与实战】数据从何而来?
🔥 第五篇:【AI机器学习入门与实战】数据预处理的招式:闪电五连鞭!
🔥 第六篇:【AI机器学习入门与实战】选择合适的算法:选择比努力重要!
🔥 第七篇:【AI机器学习入门与实战】训练模型、优化模型、部署模型
🍭实战篇
🔥 第八篇:【AI机器学习入门与实战】用户RFM模型聚类分层实战
🔥 第九篇:【AI机器学习入门与实战】使用OpenCV识别滑动验证码案例
🔥 第十篇:【AI机器学习入门与实战】CNN卷积神经网络识别图片验证码案例
未完待续…
在登录或者爬虫的过程中,我们经常遇到滑动验证码,那滑动验证码如何解决呢?使用开源的OpenCV和Selenium爬虫框架就可以帮助我们完成任务!下面让我们一起攻破它~!
验证码图片如下:
OpenCV简介
OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,实现了图像处理和计算机视觉方面的很多通用算法。它是目前计算机视觉领域最牛B最🔥的工具库,关于图像方面的问题都要使用OpenCV这个库!
滑动验证码的识别思路:
滑动验证码的识别关键是如何识别图片中的缺口,然后计算缺口的偏移(offset)距离。再通过Selenium自动化测试工具,拖拽滑块到偏移(offset)位置,即可解决滑块的验证问题。
但是这里需要注意一点,有一些反爬策略会验证滑块移动的路径和速度,用于验证是机器还是人为操作,所以再使用Selenium拖动滑块时,我们最好控制滑动速率并且可以来回晃动一下滑块再移动到准确位置。
通过OpenCV识别滑动验证码缺口:
那么如何识别图片中的缺口呢?其实很简单,只通过OpenCV就可以完美的帮助我们识别缺口。
完整代码如下:
import cv2
def cv2_match_template(bg_path, tp_path):
"""
滑动验证码匹配
:param bg_path:
:param tp_path:
:return:
"""
bg_img = cv2_imread(bg_path)
tp_img = cv2_imread(tp_path)
# 边缘检测
img_canny1 = cv2.Canny(bg_img, 200, 460)
img_canny2 = cv2.Canny(tp_img, 200, 460)
# 转换图片格式
bg_pic = cv2.cvtColor(img_canny1, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(img_canny2, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
tl = max_loc # 左上角点的坐标
x_offset = int(tl[0])
# 15 是滑动验证码凸起的距离
x_offset = (x_offset / ConfigUtil.RENDERED_RATIO) + 17
return x_offset
识别过程主要有如下几个步骤:
- 通过
cv2.imread(path)
读入图片数据 - 通过
cv2.Canny(bg_img, 200, 460)
进行边缘检测 - 转换图片格式
cv2.cvtColor(img_canny1, cv2.COLOR_GRAY2RGB)
- 进行缺口匹配
cv2.matchTemplate()
- 寻找最优匹配
cv2.minMaxLoc(res)
- 获得缺口偏移量offset
识别效果如下:
缺口的偏移量拿到后,就可以通过Selenium框架来拖动滑块到指定的偏移量位置就可以了。
伪代码如下,感兴趣自行实现。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 创建浏览器对象
driver = webdriver.Chrome()
# 打开验证码页面
driver.get("https://example.com")
# 获取滑块元素和背景图元素
slider = driver.find_element_by_xpath("//div[@class='slider']")
bg_img = driver.find_element_by_xpath("//div[@class='bg-img']")
# 通过OpenCV获取滑块偏移量,使用上面的方法
//cv2..........................
# 创建 ActionChains 对象
actions = ActionChains(driver)
# 拖动滑块
actions.click_and_hold(slider).move_by_offset(x_offset, 0).release().perform()
🎉 如果喜欢这篇文章,点赞👍 收藏⭐ 关注 ✅ 哦,创作不易,感谢!😀