前言
目前有许多网站针对爬虫采取了多种多样的措施进行反爬虫,为了不降低用户的体验度同时还能将爬虫拦截在网站之外的一个简单的措施就是验证码。随着技术的发展,验证码的种类也越来越多了,图形拼接、数字组合、简单的数学问题、点击图中的文字等等以及在文字渲染的同时加入干扰线条来增大爬取信息的难度。验证码也随之变得越来越复杂了,爬虫工作也变得越来越有挑战性了。
1.1 图形验证码的识别
在这里我们采用简单的验证码作为实例
如图1.1所示
图1.1码云注册页面
点击验证码将验证码图片保存至本地将其命名为code.jpg。这样我们就得到一张验证码图片,以供我们测试识别使用。
图1.2 验证码
下面我们新建一个项目,将我们得到的验证码图片存放至我们的根目录下,用pytesseract库识别该验证码,代码如下:
import pytesseract
from PIL import Image
# 读取验证码图片
image = Image.open('code.jpg')
# 读取验证码图片中的数据
res = pytesseract.image_to_string(image)
print(res)
在这里我们创建有image对象,调用了pytesseract的image_to_string()方法。传入该image对象,即可完成识别,实现过程非常简单。但是识别结果准确率不敢恭维。
运行结果为:aynw
如果你们按照上步骤出现如图错误了
不要着急 我教你如何解决这个bug
安装 这个软件 一路默认软件链接如下
链接:https://pan.baidu.com/s/1jz0-IqhHtZWRwJ2jXJEYSA 提取码:86lh
然后在你的代码中选中你导入的pytesseract Ctrl+b 进入之后再次ctrl+b
将你安装的软件路径复制下来
修改为如图中所示即可
对于跟实际结果有偏差的,我们还要做一下额外处理,如转灰度、二值化等操作。我们也可以利用Image对象的convert()方法参数传入L,即可将图片转化为灰度图像。代码如下:
import pytesseract
from PIL import Image
image = Image.open('code.jpg')
image = image.convert('L')
image.show()
res = pytesseract.image_to_string(image)
print(res)
传入 l 即可将图片进行二值化处理,如下所示:
image = image.convert(’1’)
image. show()
我们还可以指定二值化的阔值。 上面的方法采用的是默认阔值 127。 不过我们不能直接转化原因, 要将原图先转为灰度图像,然后再指定二值化阔值,代码如下所示:
image = image. convert(' L' )
threshold = 80
table = []
for i in range(256):
if i < threshold:
table.append(o)
else: table.append(l)
image = image.point(table,’1' )
image. show()
本节我们了解了利用pytesseract识别验证码的过程。 我们可以直接用简单的图形验证码得到结果, 也可以对验证码图片做预处理来提高识别的准确度。