Python爬虫 | 普通验证码破解 tesserocr

2020-05-11  本文已影响0人  生信师姐

验证码是众多网站采取的反爬措施。验证码的花样也很多,主要有下面这几种类验证码:
图形验证码:数字、英文字母、混淆曲线组合成的验证码。
行为验证码:识别文字,点击与文字相符的图片验证码。
交互式验证码:极难滑动验证码,滑动拼合滑块方可完成验证。
点触验证码:点击正确结果才可完成验证。
还有滑动宫格验证码、计算题验证码等。

下面涉及到的验证码有普通图形验证码、极验滑动验证码、点触验证码、微博宫格验证码。这些验证码识别方式和思路各有不同。通过了解这几种识别方式,可用类似方法识别其他类型验证码。

tesserocr

一些网站会在正常的账号密码认证之外加一些验证码,以此来明确的区分人/机行为,从一定程度上达到反爬的效果,对于简单的校验码Tesserocr就可以搞定

图形验证码的识别

知网注册页面就有类似的图形验证码:http://my.cnki.net/elibregister/commonRegister.aspx

使用 OCR 技术识别图形验证码。需要安装的库是 tesserocr。

先到知网注册页面下载验证码图片保存到本地,命名为 code.jpg,进行识别测试用。

1、 识别测试
将验证码图片放到程序所在的目录,用 tesserocr 库识别验证码,代码如下:

import tesserocr
from PIL import Image
image = Image.open('code.jpg')
result = tesserocr.image_to_text(image)
print(result)

运行代码输出为空,看来是没有成功识别验证码。
使用 tesserocr 的一个简单方法直接图片文件转为字符串,代码如下所示:

import tesserocr
print(tesserocr.file_to_text('code.jpg'))

此时识别到的结果是 SDIX,图片实际的验证码是 5DtX,识别效果不理想。
2、 验证码处理
由于验证码内有多余的线条干扰了图片的识别。需要做一些额外的处理才行,如转灰度、二值化等操作。
将图片转化为灰度图像:Image对象的 convert() 方法传入参数 L 即可。

image = image.convert('L')
image.show() # 显示图片

传入 1 可将图片进行二值化处理,如下所示:

image = image.convert('1')
image.show() # 显示图片

还可以通过指定二值化的阈值。上面的方法是采用的默认阈值 127。这还不能直接转化原图,要将原图先转为灰度图像,然后再指定二值化阈值。代码如下所示:

import tesserocr
from PIL import Image

image = Image.open('code.jpg')
image = image.convert('L')
threshold = 121
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
image = image.point(table, '1')
#image.show()
image.save('code3.jpg')
# image = image.convert('1')
#image.show()       # 显示图片
result = tesserocr.image_to_text(image)
print(result)

调试各种参数,识别效果仍然不理想。

上一篇下一篇

猜你喜欢

热点阅读