光是用户名和密码的登陆验证方式还是很难阻止爬虫的步伐,毕竟cookie或session等会话机制的存在,使得爬虫在自动登陆后变得一劳永逸。因为不借助外力爬虫本身是很难去识别图片信息的,所以如果能结合图片验证码,会使得反爬变得更容易一点。这一篇文章我们就一起来学习下如何自己绘制出图片验证码,以及如何在登陆中应用它。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
操作环境
先总结下我的操作环境:
- Centos 7
- Python 3.7
- Pycharm 2019.3
- Django 2.2
- Pillow 5.3
因为Django长期支持版本2.2LTS和前一个长期支持版本1.11LTS有许多地方不一样,需要小心区分。
Pillow绘图基本操作
虽然说有很多插件能帮助我们完成验证码这个事情,但是知其然还得知其所以然,我们通过Pillow原生绘图来理清验证码绘制和验证的原理有助于我们处理更多的绘图相关的需求。
工欲善其事必先利其器,首先来看一下Pillow这个工具画图的基本操作。
准备工具
有三个对象要准备好:
- Image对象,可以理解为一块画布
- ImageDraw对象,可以理解为一块画笔,是绘图时的主要操作对象,需要和Image对象绑定
- ImageFont对象,字体对象
首先从Pillow导入这三个类,并生成实例,需要注意的是因为历史遗留问题,Python3里面虽然安装的是Pillow,但是导入的时候还是从PIL进行导入。
from PIL import Image, ImageDraw, ImageFont
生成画布命令如下
Image.new(mode,size,color=0)
mode
可以是彩色图片用到的RGB模式,也可以是计算机处理常用的灰度图片的L模式。如果是RGB模式,所有的颜色都是三元素元组,如果是L模式,所有的颜色都是单值size
是一个二元元组,分别是pixel为单位的宽和高。需要注意计算机中的坐标都是以左上角为原点,左边为x,下面为ycolor
是画布的背景色,根据前面的mode
进行设置
例如生成一块白色画布
mode = 'RGB'
bg_size = (300, 100)
bg_color = (255, 255, 255)
img = Image.new(mode, bg_size, bg_color)
img.show()
之后显示如下
生成画笔命令如下
ImageDraw.Draw(im, mode=None)
im
是一个Image对象,画笔必须要和画布绑定才能操作mode
填一个和画布一样的模式即可
生成一个画笔,绑定上面的画布
draw = ImageDraw.Draw(img, mode)
生成字体命令如下
ImageFont.truetype(
['font=None', 'size=10', 'index=0', "encoding=''", 'layout_engine=None'],
)
通常指定字体和大小即可,而且实际赋值的时候不用写为list
font
是一