爬虫学习笔记(十七)—— 字符验证码

一、认识验证码

1.1、概念

验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种用来区分用户是计算机还是人的公共全自动程序。


1.2、作用

认证码是一种人机识别手段,最终目的是区分正常用户和机器的操作。

可以防止:恶意破解密码、注册、刷票、论坛灌水,防止黑客对用户的密码进行暴力破解。

一般是提出一个问题,这个问题可以由计算机生成并评判,但是必须只有人类才能解答。由于计算机无法解答这个的问题,所以回答出问题的用户就可以被认为是人类。


1.3、类别

图形验证码

这类验证码大多是计算机随机产生一个字符串,在把字符串增加噪点、干扰线、变形、重叠、不同颜色、扭曲组成一张图片来增加识别难度。

滑动验证码

也叫行为验证码,比较流行的一种验证码,通过用户的操作行为来完成验证,其中最出名的就是极验。滑动验证码的原理就是使用机器学习中的深度学习技术,根据一些特征来区分是否为正常用户。通过记录用户的滑动速度,还有每一小段时间的瞬时速度,用户鼠标点击情况,以及滑动后的匹配程度来识别。而且,不是说滑动到正确位置就是验证通过,而是根据特征识别来区分是否为真用户,滑到正确位置只是一个必要条件。

点触验证码

点击类验证码都是给出一张包含文字的图片,通过文字提醒用户点击图中相同字的位置进行验证。


二、Pillow库

2.1、PIL库和Pillow库

PIL库

PIL (Python Image Library) 已经算是 Python 处理图片的标准库了,兼具强大的功能和简洁的 API,但是PIL库的更新非常缓慢, 并且它只支持到python2.7,不支python3。

Pillow库

由于PIL库更新太慢了,于是一群志愿者在PIL库的基础上创建的分支版本,命名为Pillow.
Pillow目前最新支持到python3.6,它的维护和开发十分活跃,兼容PIL库的绝大多数语法,并且增加了许多新的特性,推荐直接使用Pillow


2.1.1、Pillow库安装

命令:

pip install  pillow

2.1.2、PIL与Pillow使用注意

Pillow和PIL不能共存在一个环境中,如果你之前安装了PIL的话,需要删除掉才能在安装Pillow
由于是继承自PIL的分支, 所以Pillow库的导入是这样的:

Import PIL

2.2、图形基本概念

2.2.1、尺寸

图片尺寸(size)指的是图片的宽度和高度,通过size属性可以获取图片的尺寸,它的返回值是一个元组,元组里面有两个值,分别是水平和垂直方向上的像素个数。

代码示例:

from PIL import Image
img = Image.open('xxx.png')  #参数:图片位置
print(img.size)  #(xxx,xxx)

2.2.2、坐标系统

使用笛卡尔像素坐标系,x轴从左到右,y轴从上到下增长


2.2.3、通道

图片均是由一个或者多个数据通道构成。

RGB图像:每张图片都是由三个数据通道叠加构成,分别为R 、G 、B。

PNG图像:有RGBA四个通道,A代表透明度。

灰度图像(没有色彩的图片, RGB色彩分量全部相等):只有一个通道。

灰度指的是黑白图像中点的颜色深度,范围一般是0到255, 白色为255,黑色为0。


2.3、图像获取

  1. 从文件中加载图像

例:

from PIL import Image
img = Image.open('dog2.png')  #open参数: 图片的位置
  1. 创建一个新的图像

例:

img =Image.new("RGB",(200,100),"red")

注意:这里的最后一个参数可以用ImageColor里面的colormap来获得更多初始化的颜色。

  1. 切割图片

函数:

Image.crop(left, up, right, below)

参数:
① left:与左边界的距离
② up:与上边界的距离
③ right:还是与左边界的距离
④ below:还是与上边界的距离

例:

from PIL import Image

img = Image.open('dog2.png')
w,h = img.size

# 准备将图片切割成9张小图片
weight = int(w // 3)
height = int(h // 3)
# 切割后的小图的宽度和高度
print(weight, height)

for j in range(3):
    for i in range(3):
        box = (weight * i, height * j, weight * (i + 1), height * (j + 1))
        region = img.crop(box)
        region.save('imgs/{}{}.png'.format(j, i))

结果:


2.4、获取图像通道

函数:getbands()

例:

from PIL import Image

img = Image.open('
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值