写点什么

神器!使用 Python 轻松识别验证码

  • 2024-05-11
    江西
  • 本文字数:2208 字

    阅读完需:约 7 分钟

前言

在我们进行自动化测试的过程中,免不了要在登录时遇到验证码,很多时候我们都是只能找开发要万能验证码或者暂时关闭验证码这个功能,但是有时候我们必须要验证码是否能够正常生成,所以在这个时候,我们需要做的就是输入验证码,但是验证码这个东西是随机生成的,不是每一次都一样,所以我们还是需要识别然后输入,脚本是没有眼睛的,只能通过代码来进行识别,所以本文就来给大家介绍一下如何使用 Python 来轻松识别数字验证码。

获取更多技术资料,请点击!

安装 Python 库和软件环境

验证码识别需要用到一些 Python 库和软件环境,下面将介绍它们的安装步骤。


  1. 安装 Tesseract OCR


它是一个开源的光学字符识别引擎,用于识别验证码中的文本内容,能够识别 70 多种语言的文本,并为开发者提供简单易用的 API。可以通过以下链接下载和安装:https://github.com/tesseract-ocr/tesseract 。在 Windows 系统下可以下载 exe 文件进行安装。


注:Tesseract 安装完成后需要将tesseract.exe文件路径加入系统的环境变量,否则无法在 Python 脚本中调用。


  1. 所需 Python 库


验证码识别需要使用的 Python 库包括:pillow(PIL)pytesseractopencv-python。pillow 为 Python 自带的标准库,其它库可以使用 pip 命令自动安装:


pip install pytesseractpip install opencv-python
复制代码

识别简单的数字验证码

  1. 准备验证码图片


首先,我们需要准备一些验证码图片。可以在网络上搜索验证码图片进行下载,或者使用 Python 的爬虫程序去爬取目标网站的验证码。这里我们先手动下载一个简单的数字验证码图片,保存为“test.jpg”。


  1. 加载验证码图片


我们可以使用 Pillow 库(Python Imaging Library)加载验证码图片。Pillow 库可以读取和处理不同类别的图片格式,如 jpg、png、bmp 等等。代码如下:


from PIL import Imageimg = Image.open('test.jpg')img.show()
复制代码


  1. 识别验证码


使用pytesseract库,我们可以很容易地把图片中的数字识别出来。pytesseract库依赖于 Tesseract OCR 引擎,能够处理各种难度的验证码,如数字、字母、汉字、倾斜、变形等等。代码如下:


import pytesseracttext = pytesseract.image_to_string(Image.open('test.jpg'), lang='eng')print(text)
复制代码


这段代码的意思是用pytesseract库将图片中的字符串转换为字符。lang参数可以指定识别的语言类型,这里我们使用了eng,表示英文。如果验证码是汉字,设置为chi_sim即可。

识别数字字母混合的验证码

当验证码中既包含数字又包含字母时,需要对识别的方法进行修改,下面介绍一种简单的处理方法,即通过二值化和降噪处理来增加识别率。


二值化处理


二值化处理就是将图片中的所有像素转换为黑白两种颜色。对于验证码图片,我们可以将其转换为黑白灰度图像,便于后续的处理。代码如下:


import cv2img = cv2.imread('test.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)cv2.imshow('Image', threshold)cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


这段代码用 OpenCV 库将图片读取为灰度图像,并进行二值化处理。其中,127 是阈值,值越小,黑色部分就越多,白色部分就越少。运行后可以得到二值化后的图片。


降噪处理


在二值化后,图片中仍有一些噪点和干扰线条。如果不处理这些噪声,将会影响后续的字符识别,因此需要进行降噪处理,将图片中的噪点和干扰线条消除。代码如下:


import cv2img = cv2.imread('test.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)blur = cv2.GaussianBlur(threshold,(5,5),0)cv2.imshow('Image', blur)cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


这段代码使用高斯滤波函数对图片进行平滑处理,消除噪声和干扰线条。其中(5,5)指定核的大小,值越大,平滑效果越明显。运行后可以得到处理后的图片。


识别验证码


对于数字和字母混合的验证码,我们需要对每个字符进行识别。可以采用字符分割的方法,将验证码图片分割成单个字符图片,再进行字符识别。代码如下:


import pytesseractimport cv2img = cv2.imread('test.jpg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)retval, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)blur = cv2.GaussianBlur(threshold, (5,5), 0)contours, hierarchy = cv2.findContours(blur, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)count = 0for contour in contours:    (x,y,w,h) = cv2.boundingRect(contour)    if w > 10 and h > 10:        roi = blur[y:y+h, x:x+w]        cv2.imwrite(str(count)+'.jpg', roi)        text = pytesseract.image_to_string(roi, lang='eng')        print(text)        count += 1cv2.imshow('Image', img)cv2.waitKey(0)cv2.destroyAllWindows()
复制代码


这段代码先对图片进行二值化和降噪处理,然后使用findContours函数找到并分割出每个字符的边缘轮廓。再使用boundingRect函数得到每个字符的位置和大小,并使用image_to_string函数对每个字符进行字符识别。运行代码后,可以看到输出结果为分割出的每个字符及其识别结果。

总结

本文介绍了如何使用 Python 和相关库来识别数字验证码。通过这种方法,我们可以实现验证码的自动识别,用于自动化测试、爬虫程序或其他需要验证码处理的场景。在实际应用中,可以根据具体的需求对识别方法进行进一步优化和调整,以获得更好的识别效果。

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
神器!使用Python 轻松识别验证码_霍格沃兹测试开发学社_InfoQ写作社区