本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
以下文章来源于腾讯云 作者:咸鱼学Python
( 想要学习Python?Python学习交流群:1039649593,满足你的需求,资料都已经上传群文件流,可以自行下载!还有海量最新2020python学习资料。 )
爬虫和验证码就是天生的冤家,用 Python 生成验证码应该是用 Python 对抗验证码的第一步,所以今天先来研究研究如何用 Python 生成一个便于我们入手的验证码。
这里不是造轮子,只是踩踩坑,目前 Github 上关于验证码对抗的开源项目非常多,这里推荐两个,有经验的朋友直接跳过下面的内容,学习这两个项目就好。
验证码训练:(以下介绍内容来自官方的介绍)
https://github.com/kerlomz/captcha_trainer
基于深度学习的图片验证码的解决方案 - 该项目能够秒杀字符粘连重叠/透视变形/模糊/噪声等各种干扰情况,足以解决市面上绝大多数复杂的验证码场景,目前也被用于其他OCR场景。
该项目基于 TensorFlow 1.14 开发,旨在帮助中小企业或个人用户快速构建图像分类模型并投入生产环境使用,降低技术应用门槛。
验证码部署:
https://github.com/kerlomz/captcha_platform
关于部署,大佬也提供了相应的文章:https://www.jianshu.com/p/80ef04b16efc
生成一张简单的验证码
这里需要安装captcha这个库
pip install captcha
接下来使用下面这段代码,就可以得到一个简单的验证码图片
from captcha.image import ImageCaptcha import matplotlib.pyplot as plt import random import string # 定义字符集是数字和字符 chs=string.digits+string.ascii_uppercase print(chs) # 定义长度,宽度,字符个数,类别 width,height,n_len,n_class=170,80,4,len(chs) # 定义图片宽度与高度 generator=ImageCaptcha(width=width,height=height) # 生成一个4位随机字符串 random_str="".join([random.choice(chs) for i in range(4) ]) print(random_str) # 生成随机验证码 img=generator.generate_image(random_str) plt.imshow(img) plt.title(random_str) plt.show()
这个时候可以得到下面这样的图片
光光这样一张图片坑定是满足不了我的需求的所以,改改上面的代码,把他弄成一个生成多张图片程序。
from captcha.image import ImageCaptcha import matplotlib.pyplot as plt import numpy as np import random import string chs = string.digits + string.ascii_uppercase width, height, n_len, n_class = 170, 80, 4, len(chs) def createxy(batch_size=100): X = np.zeros((batch_size, height, width, 3), dtype=np.uint8) Y = [np.zeros((batch_size, n_class), dtype=np.uint8) for i in range(n_len)] generator = ImageCaptcha(width=width, height=height) while True: for i in range(batch_size): # 随机字符串 random_str = "".join([random.choice(chs) for j in range(4)]) # 根据随机字符串生成验证码 X[i] = generator.generate_image(random_str) for j, ch in enumerate(random_str): Y[j][i, :] = 0 Y[j][i, chs.find(ch)] = 1 yield X, Y def getycode(y): # 降低维度,取出非0数据 y = np.argmax(np.array(y), axis=2)[:, 0] # 显示等于1的取出字符 return "".join([chs[x] for x in y]) X, Y = next(createxy(1)) plt.imshow(X[0]) plt.title(getycode(Y)) plt.show()
弄完上面这些个就可以开始试着训练了
原文:https://www.cnblogs.com/aa1273935919/p/14120694.html