首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
1.1 HTTP基本原理
1.2 Web 网页基础
1.3 爬虫的基本原理
1.4 Session和Cookie
1.5 代理的基本原理
1.6 多线程和多进程的基本原理
2.1 urllib的使用
2.2 requests的使用
2.3 正则表达式
2.4 httpx的使用
2.5 基础爬虫案例实战
3.1 XPath的使用
3.2 Beautiful Soup的使用
3.3 pyquery的使用
3.4 parsel 的使用
4.1 TXT 文本文件存储
4.2 JSON 文件存储
4.3 CSV 文件存储
4.4 MySQL 存储
4.5 MongoDB 文档存储
4.6 Redis缓存存储
4.7 Elasticsearch 搜索引擎存储
4.8 RabbitMQ 的使用
5.1 什么是 Ajax
5.2 Ajax分析方法
5.3 Ajax 分析与爬取实战
6.1 协程的基本原理
6.2 aiohttp的使用
6.3 aiohttp 异步爬取实战
7.1 Selenium 的使用
7.2 Splash 的使用
7.3 Pyppeteer 的使用
7.4 Playwright 的使用
7.5 Selenium 爬取实战
7.6 Pyppeteer 爬取实战
7.7 CSS 位置偏移反爬案例分析与爬取实战
7.8 字体反爬案例分析与爬取实战
8.1 使用 OCR 技术识别图形验证码
8.2 使用 OpenCV 识别滑动验证码的缺口
8.3 使用深度学习识别图形验证码
8.4 使用深度学习识别滑动验证码的缺口
8.5 使用打码平台识别验证码
8.6 手机验证码的自动化处理
9.1 代理的设置
9.2 代理池的维护
9.3 付费代理的使用
9.4 ADSL 拨号代理的搭建方法
9.5 代理反爬案例爬取实战
10.1 模拟登录的基本原理
10.2 基于Session和Cookie的模拟登录爬取实战
10.3 基于JWT的模拟登录爬取实战
10.4 大规模账号池的搭建
11.1 网站加密和混淆技术简介
11.2 浏览器调试常用技巧
11.3 JavaScript Hook 的使用
11.4 无限 debugger 的原理与绕过
11.5 使用 Python 模拟执行 JavaScript
11.6 使用 Node.js 模拟执行 JavaScript
11.7 浏览器环境下 JavaScript 的模拟执行
11.8 AST 技术简介
11.9 使用 AST 技术还原混淆代码
11.10 特殊混淆案例的还原
11.11 WebAssembly 案例分析和爬取实战
11.12 JavaScript 逆向技巧总结
11.13 JavaScript 逆向爬取实战
当前位置:
首页>>
技术小册>>
Python3网络爬虫开发实战(上)
小册名称:Python3网络爬虫开发实战(上)
### 8.2 使用 OpenCV 识别滑动验证码的缺口 在网络爬虫开发中,经常遇到需要通过验证码来验证用户身份的场景,尤其是滑动验证码,它要求用户将滑块拖动到指定位置以完成验证。这种验证方式相比传统的字符或图形验证码,更加难以自动化破解,但通过使用计算机视觉库如OpenCV,我们依然可以找到破解这类验证码的有效方法。本章节将详细介绍如何使用OpenCV来识别滑动验证码中的缺口位置,进而实现自动滑动验证。 #### 8.2.1 滑动验证码原理简述 滑动验证码通常包含两部分:背景图和滑块图。背景图上会有一条明显的缺口或者模糊区域,滑块图则是一个与背景图部分相似的图形,用户需要将其拖动到与背景图上缺口对应的位置以完成验证。滑动验证码的设计初衷是区分人类与自动化脚本,因为它依赖于人类对图形细微差别的感知能力。 #### 8.2.2 OpenCV基础 在开始之前,简要回顾一下OpenCV的基本功能。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理和图像分析功能。在Python中,我们通常通过安装`opencv-python`包来使用OpenCV。 ```bash pip install opencv-python ``` #### 8.2.3 准备工作 1. **获取验证码图片**:首先,你需要获取到滑动验证码的背景图和滑块图。这通常意味着你需要使用浏览器开发者工具(如Chrome的DevTools)来捕获网络请求,或者编写专门的脚本模拟登录过程并捕获验证码图片。 2. **安装和导入必要的库**: ```python import cv2 import numpy as np ``` #### 8.2.4 图像处理步骤 ##### 8.2.4.1 读取图片 使用OpenCV读取背景图和滑块图。 ```python background_img = cv2.imread('background.png', cv2.IMREAD_GRAYSCALE) slider_img = cv2.imread('slider.png', cv2.IMREAD_GRAYSCALE) ``` ##### 8.2.4.2 预处理 为了提高识别精度,通常需要对图片进行预处理,包括降噪、边缘检测等。 - **降噪**:使用高斯模糊去除图片噪声。 ```python background_blurred = cv2.GaussianBlur(background_img, (5, 5), 0) slider_blurred = cv2.GaussianBlur(slider_img, (5, 5), 0) ``` - **边缘检测**:利用Canny算法检测图片边缘。 ```python edges_background = cv2.Canny(background_blurred, 50, 150) edges_slider = cv2.Canny(slider_blurred, 50, 150) ``` ##### 8.2.4.3 缺口识别 缺口识别是整个流程的核心,主要思路是通过对比背景图和滑块图之间的差异来定位缺口。 - **模板匹配**:将滑块图作为模板,在背景图上滑动匹配,找到相似度最低(即差异最大)的位置,这通常是缺口所在位置。 ```python result = cv2.matchTemplate(background_img, slider_img, cv2.TM_CCOEFF_NORMED) threshold = 0.8 # 设定一个阈值,用于区分匹配程度 loc = np.where(result <= threshold) for pt in zip(*loc[::-1]): cv2.rectangle(background_img, pt, (pt[0] + slider_img.shape[1], pt[1] + slider_img.shape[0]), (0, 0, 255), 2) ``` 注意:这里使用的`cv2.TM_CCOEFF_NORMED`方法返回的是模板匹配结果的归一化相关系数,值越接近1表示匹配度越高。然而,对于寻找缺口,我们更关心的是匹配度低(即差异大)的区域。 - **优化匹配策略**:考虑到缺口可能不完全位于匹配度最低的区域,可能需要对匹配结果进行进一步处理,如使用形态学操作(如膨胀、腐蚀)来增强缺口特征,或者使用更复杂的图像处理技术如特征点检测与匹配。 ##### 8.2.4.4 计算滑动距离 一旦确定了缺口的位置,就可以计算出滑块需要滑动的距离。这通常涉及到将缺口的位置转换为滑块应到达的坐标系统中的位置。 ```python # 假设我们找到了缺口的一个边界点 (x_gap, y_gap) # 计算滑块中心应到达的x坐标 slider_center_x = x_gap - (slider_img.shape[1] // 2) ``` #### 8.2.5 实战注意事项 1. **验证码的多样性**:不同的网站或应用可能会使用不同的验证码策略,包括验证码的样式、尺寸、缺口位置等,因此需要根据实际情况调整图像处理参数和匹配策略。 2. **反爬虫机制**:网站可能会部署反爬虫技术,如检测鼠标移动轨迹、IP地址频率限制等,因此在使用自动化脚本时需要采取相应的防护措施,如设置合适的延时、使用代理IP等。 3. **法律与道德**:在使用自动化脚本处理验证码时,务必确保你的行为符合相关法律法规和道德标准,避免侵犯他人隐私或进行非法活动。 #### 8.2.6 总结 通过本章节的学习,我们了解了如何使用OpenCV来识别滑动验证码中的缺口,并探讨了图像处理、模板匹配等关键技术。尽管滑动验证码的设计初衷是防止自动化攻击,但通过合理利用计算机视觉技术,我们仍然可以找到有效的解决方案。然而,值得注意的是,随着技术的进步和验证码设计的不断完善,这些解决方案的有效性可能会逐渐降低,因此持续学习和探索新的方法至关重要。
上一篇:
8.1 使用 OCR 技术识别图形验证码
下一篇:
8.3 使用深度学习识别图形验证码
该分类下的相关小册推荐:
Python合辑7-集合、列表与元组
Python编程轻松进阶(五)
Python合辑3-字符串用法深度总结
Python合辑4-130个字符串操作示例
Python合辑9-判断和循环
剑指Python(磨刀不误砍柴工)
Python合辑6-字典专题
Python爬虫入门与实战开发(下)
Python合辑5-格式化字符串
Python自动化办公实战
Python爬虫入门与实战开发(上)
Python机器学习基础教程(上)