1. 引言
验证码(CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart)是一种广泛用于网站和应用程序的安全性验证方法。它旨在区分机器和人类用户。
2. 需要的库
# coding:utf8
from captcha.image import ImageCaptcha
from random import randint
import os
import csv
captcha.image.ImageCaptcha
:这是一个用于生成验证码图片的库。random.randint
:用于生成随机字符。os
:用于文件和目录操作。csv
:用于创建和写入CSV文件。
3. 生成验证码图片
def captcha_pic_builder():
'''
生成序列验证码图片及包含其对应目标值的csv文件
:return:
'''
函数的注释提供了关于函数目的的简要说明。在这个函数中,我们将生成包含四个随机字符的验证码图片。生成的验证码将保存为文件,并且相应的标签也将写入CSV文件中。
4. 随机字符生成
下面的代码片段用于生成随机字符并将它们组合成验证码:
list = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V', 'W', 'X', 'Y', 'Z']
for j in range(20):
chars = ''
for i in range(4):
chars += list[randint(0, 25)]
print(chars)
list
包含了大写字母 A 到 Z,用于生成验证码的字符池。- 我们使用一个外部循环来生成 20 个验证码。
- 在内部循环中,我们随机选择一个字符并将其添加到
chars
变量中,以创建一个包含 4 个字符的验证码。
5. 生成和保存图片
使用 ImageCaptcha
库生成验证码图片,并将其保存在本地文件夹:
# 生成图片
image = ImageCaptcha().generate_image(chars)
# image.show()
filename = str(j) + '.jpg'
# 将图片保存到本地
image.save(os.path.join('./captcha_pic/', filename))
- 使用
ImageCaptcha().generate_image(chars)
来生成验证码图片,其中chars
包含了生成的随机字符。 filename
用于指定图片的文件名,使用循环索引j
来确保每个图片都有唯一的名称。- 最后,使用
image.save()
方法将图片保存到名为captcha_pic
的文件夹中。
6. 创建CSV文件
将生成的验证码标签写入CSV文件,以便将来可以将这些标签与相应的验证码图片关联起来:
with open('./captcha_pic/labels.csv', 'a+', newline='') as csvfile:
writer = csv.writer(csvfile, dialect='excel')
writer.writerow(['file_num', 'chars'])
for j in range(20):
# ...
# 添加样本序列及目标值
writer.writerow([j, chars])
- 使用
open()
函数打开名为labels.csv
的CSV文件,如果文件不存在,将会被创建。 - 用
csv.writer
创建一个CSV写入器,并指定标头行为['file_num', 'chars']
。 - 在循环中,将每个验证码的序列号和字符标签写入CSV文件中。
完整代码如下:
from captcha.image import ImageCaptcha
from random import randint
import os
import csv
def captcha_pic_builder(n):
code = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
'V',
'W', 'X', 'Y', 'Z']
# 因为csv标签名不能放在循环里的缘故,故将创建及增加内容放在外面
# newline='',是为了防止以Excel打开时会多出空行
with open('./captcha_pic/labels.csv', 'a+', newline='') as csvfile:
writer = csv.writer(csvfile, dialect='excel')
writer.writerow(['file_num', 'chars'])
for j in range(n):
chars = ''
for i in range(4):
chars += code[randint(0, 25)]
print(chars)
# 生成图片
image = ImageCaptcha().generate_image(chars)
# image.show()
filename = str(j) + '.jpg'
# 将图片保存到本地
image.save(os.path.join('./captcha_pic/', filename))
# 添加样本序列及目标值
writer.writerow([j, chars])
return None
if __name__ == '__main__':
input('请确保已经创建captcha_pic文件夹,按回车键继续...')
n = int(input('请输入要生成的验证码图片数量:'))
captcha_pic_builder(n)