带带弟弟 ocr 对各种类型验证码说不

封面

在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,简单一点的有字母验证码,复杂一点的有滑块验证码,点选文章和点选图片验证码。这些都是爬虫中的老大难问题,今天介绍一款通用验证码识别 SDK 对他们彻底说拜拜,它的名字是 ddddocr 带带弟弟 OCR 通用验证码识别 SDK 免费开源版。

安装

将自动安装符合自己电脑环境的最新 ddddocr。Python 环境需要小于等于 3.9。

1
pip install ddddocr

使用

带带弟弟 OCR 可以识别三种验证码,小编就用这三种来实验一下。

滑块验证码

滑块验证码这里用的是豆瓣的滑块验证。下滑块是单独的透明背景图 hycdn.png。

hycdn.png

背景图是带小滑块坑位的 background.jpg。

background

1
2
3
4
5
6
7
8
9
10
11
12
13
import ddddocr

det = ddddocr.DdddOcr(det=False, ocr=False)

with open('hycdn.png', 'rb') as f:
        target_bytes = f.read()
    
with open('background.jpg', 'rb') as f:
    background_bytes = f.read()

res = det.slide_match(target_bytes, background_bytes, simple_target=True)

print(res)

识别结果

1
{'target_y': 0, 'target': [486, 126, 622, 262]}

target 属性的前两个值正好和豆瓣验证滑块 url 中提交的 ans 差不多。

点选类验证码

点选类验证码用的是网易登录

eb.jpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
det = ddddocr.DdddOcr(det=True)

    with open("eb.jpg", 'rb') as f:
        image = f.read()

    poses = det.detection(image)

    im = cv2.imread("eb.jpg")

    for box in poses:
        x1, y1, x2, y2 = box
        im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)

    cv2.imwrite("result.jpg", im)

识别结果

字母数字验证码

字母数字验证码的图片来自于 google 搜索

1
2
3
4
5
6
7
ocr = ddddocr.DdddOcr(old=True)

with open("z1.jpg", 'rb') as f:
    image = f.read()

res = ocr.classification(image)
print(res)

识别结果

1
2
3n3d
8342

总结

ddddocr 让验证码变得如此简单与易用,,让不会用 opencv, pytorch, tensorflow 的小伙伴也能快速的破解网站的登录验证码。小伙伴们如果有其他好的 ocr 识别也可以在留言中分享出来。

Python Geek Tech wechat
欢迎订阅 Python 技术,这里分享关于 Python 的一切。