python通过pillow识别动态验证码的示例代码

2023-12-16Python编程
84

当我们在使用Python模拟登录一些网站时,往往会遇到验证码的问题。如果验证码是静态的,比如数字和字母组成的验证码,我们可以直接使用tesseract或者第三方库来识别,但是如果验证码是动态的,比如不断变化的验证码,这就需要使用一些其他的方法来识别。这个时候,我们可以使用Python中的第三方库Pillow来对动态验证码进行识别。

Pillow原本是Python标准库中的一个组件:Python Imaging Library(PIL)。但是由于PIL不再开发维护,因此Pillow成为了一个替代库,提供了与PIL库类似的功能,并加入了对Python 3.x版本的支持。

下面是使用Pillow识别动态验证码的示例代码攻略:

安装Pillow库

我们使用pip命令来安装:

pip install Pillow

打开图片

使用Pillow库中的Image模块打开需要识别的验证码图片。可以使用Image.open()函数来实现。

from PIL import Image
im = Image.open(r'captcha.png')

获取每一帧图片

对于动态验证码,每一帧都是不同的,我们需要获取每一帧的图片进行处理。可以使用ImageSequence模块来实现。

from PIL import ImageSequence
for frame in ImageSequence.Iterator(im):
    frame.show()

代码中使用了ImageSequence.Iterator()函数来获取每一帧。frame.show()函数可以暂时显示每一帧的图片,方便我们观察和调试。

对每一帧进行识别

对于每一帧,我们可以使用第三方库进行识别,这里以pytesseract为例子。安装pytesseract:

pip install pytesseract

然后,我们可以使用pytesseract提供的image_to_string()函数来识别验证码。需要注意的是,由于每一帧的图片都不同,因此需要利用cv2模块进行图像处理,将图片二值化等操作后再进行识别。

这里给出一个使用pytesseract识别第一帧图片的示例代码:

import cv2
import pytesseract
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

for frame in ImageSequence.Iterator(im):
    img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    result = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
    print(result)
    break

该代码中,我们使用pytesseract库识别了第一帧图片,并将识别结果打印出来。cv2模块的使用,可以参考这个教程:Python 图像处理 OpenCV 教程。

识别正确的验证码

对于动态验证码,我们需要识别出正确的验证码才能通过验证。一种常用的方法是对每一帧进行识别,将出现的所有验证码存储到一个list中,然后通过一定的策略来判断正确的验证码。

假设我们通过第一帧成功识别出三个验证码:A、B、C。根据观察得知,第二帧和第三帧都包含了B,因此我们可以断言,正确的验证码就是B。

下面给出一个代码演示:

result_list = []
for frame in ImageSequence.Iterator(im):
    img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
    result = pytesseract.image_to_string(thresh, lang='eng', config='--psm 6')
    result_list.append(result)

# 对result_list中的识别结果进行处理,得到正确的验证码
correct_captcha = ""
for i in range(len(result_list[0])):
    if all(j[i] == result_list[0][i] for j in result_list):
        correct_captcha += result_list[0][i]

print("验证码是:", correct_captcha)

以上是使用Pillow识别动态验证码的示例攻略,希望对大家有所帮助。

The End

相关推荐

解析Python中的eval()、exec()及其相关函数
Python中有三个内置函数eval()、exec()和compile()来执行动态代码。这些函数能够从字符串参数中读取Python代码并在运行时执行该代码。但是,使用这些函数时必须小心,因为它们的不当使用可能会导致安全漏洞。...
2023-12-18 Python编程
117

Python下载网络文本数据到本地内存的四种实现方法示例
在Python中,下载网络文本数据到本地内存是常见的操作之一。本文将介绍四种常见的下载网络文本数据到本地内存的实现方法,并提供示例说明。...
2023-12-18 Python编程
101

Python 二进制字节流数据的读取操作(bytes与bitstring)
来给你详细讲解下Python 二进制字节流数据的读取操作(bytes与bitstring)。...
2023-12-18 Python编程
120

Python3.0与2.X版本的区别实例分析
Python 3.x 是 Python 2.x 的下一个重大版本,其中有一些值得注意的区别。 Python 3.0中包含了许多不兼容的变化,这意味着在迁移到3.0之前,必须进行代码更改和测试。本文将介绍主要的差异,并给出一些实例来说明不同点。...
2023-12-18 Python编程
34

python如何在终端里面显示一张图片
要在终端里显示图片,需要使用一些Python库。其中一种流行的库是Pillow,它有一个子库PIL.Image可以加载和处理图像文件。要在终端中显示图像,可以使用如下的步骤:...
2023-12-18 Python编程
91

Python图像处理实现两幅图像合成一幅图像的方法【测试可用】
在Python中,我们可以使用Pillow库来进行图像处理。具体实现两幅图像合成一幅图像的方法如下:...
2023-12-18 Python编程
103