python验证码

Python的验证码

在Python中不管是做网站开发还是爬虫分析,都需要跟验证码打交道,然而Python简洁的一点就是有很多的库,可以代替我们去做验证码的生成,以及验证码的识别的操作,但是我们也是需要明白验证码的原理的。

写一个简单的程序,来生成验证码

项目思路:

1)定义一张图片

2)创建画笔

3)绘制线条和点

4)绘制验证码文字

5)定义扭曲的参数

6)使用滤镜

简而言之,就是生成一张图片,在这个图片上随机生成文字,以及一些点、线、扭曲字体等来稍做干扰。

代码如下:

# -*- coding:utf-8 -*-
import sys

reload(sys)
sys.setdefaultencoding("utf-8")
from PIL import Image,ImageDraw,ImageFont,ImageFilter
import random # 随机模块,生成随机数
# 1.Image 处理图片
# 2.Imagedraw 处理画笔
# 3.ImageFont 处理字体
# 4.ImageFilter
# 项目思路
    # 1.定义一张图片
img = Image.new("RGB",(150,50),(255,255,255))
'''
1.代表采用RGB色彩模式
2.代表图片大小
3.具体图片颜色
'''
    # 2.创建画笔
draw = ImageDraw.Draw(img)
    # 3.绘制线条和点
    # 绘制线
for i in range(random.randint(1,10)):
    draw.line(
        # 绘制线条时,每条线有两个点,每个点靠x,y两个值确定位置
        [
            (random.randint(1,150),random.randint(1,150)),
            (random.randint(1,150),random.randint(1,150))
        ],
        fill=(0,0,0)
    )
    # 绘制点
for i in range(1000):
    draw.point(
        [
            random.randint(1,150),
            random.randint(1,150)
        ],
        fill=(0,0,0)
    )
    # 4.绘制我们的文字
        # 文字随机产生
        # 个数一定
            # 定义生成随机的字母和数字
font_list = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890")
# random.sample 随机从列表中取出一定个数的元素
c_chars = "".join(random.sample(font_list,5))
    # 绘制字体
        # 定制字体
font = ImageFont.truetype("simsun.ttc",32)
draw.text((10,5),c_chars,font=font,fill="red")
'''
1 代表文字的位置,距离上,左的位置
2 代表文字的内容
3 代表字体
4 代表字体颜色
'''
    # 5.定义扭曲的参数
params = [1 - float(random.randint(1,2))/100,
          0,
          0,
          0,
          1 -float(random.randint(1,2))/100,
          float(random.randint(1,2))/500,
          0.001,
          float(random.randint(1,1))/500,
        ]
    # 6.使用滤镜
        # 添加滤镜
img = img.transform((150,50),Image.PERSPECTIVE,params)
'''
1.扭曲范围
2.扭曲样式
3.扭曲参数
'''
        # 添加扭曲
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
img.show()

运行就可生成简单的验证码,可根据实际需求,做相应复杂度的验证码


posted @ 2017-10-30 22:53  zhaobig  阅读(193)  评论(0)    收藏  举报