使用Python识别和处理验证码的代码示例

 更新时间:2025年01月21日 08:46:48   作者:傻啦嘿哟  
验证码作为一种常见的安全手段,广泛应用于各种网站和应用中,以防止自动化脚本的恶意攻击,然而,在自动化测试或数据抓取过程中,识别验证码成为了一个不得不面对的问题,本文将详细介绍如何使用Python来识别和处理验证码,通过实际案例和代码,帮助读者理解整个流程

一、验证码的种类

在介绍识别方法之前,我们先了解一下常见的验证码种类:

  • 计算验证码:需要用户进行简单的数学计算,如“3+5=?”。
  • 滑块验证码:用户需要将滑块拖动到正确的位置,以完成验证。
  • 识图验证码:通过识别图片中的字符或图案来完成验证。
  • 语音验证码:通过语音播报验证码内容,用户输入听到的内容。

本文重点介绍的是识图验证码的识别方法,因为这类验证码在自动化测试中最为常见。

二、OCR技术简介

OCR(Optical Character Recognition,光学字符识别)技术,是指通过扫描字符,然后通过其形状将其翻译成电子文本的过程。OCR技术在验证码识别中扮演着重要角色。

Python中有多个OCR库可以使用,如tesseract、pytesseract、pyocr等。其中tesseract是Google开源的一个强大的OCR引擎,而pytesseract和pyocr都是对tesseract做了一层Python API封装,方便我们在Python中调用。

三、使用OCR技术识别验证码

1. 安装所需库

首先,我们需要安装tesseract引擎和pytesseract库。同时,还需要一些图像处理库,如PIL(Pillow)或OpenCV。

# 安装tesseract(以Windows为例)
# 下载tesseract安装包,并安装到指定目录,如C:\Program Files\Tesseract-OCR
 
# 安装pytesseract和Pillow
pip install pytesseract Pillow

安装完成后,需要配置pytesseract,使其能够找到tesseract的可执行文件。在Python代码中,可以通过设置pytesseract.pytesseract.tesseract_cmd来实现。

import pytesseract
 
# 设置tesseract可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

2. 下载和处理验证码图片

接下来,我们需要下载验证码图片,并进行一些预处理,以提高OCR的识别准确率。

import requests
from PIL import Image
 
# 下载验证码图片
url = 'https://example.com/captcha'  # 替换为实际的验证码URL
response = requests.get(url)
with open('captcha.jpg', 'wb') as f:
    f.write(response.content)
 
# 打开图片并进行预处理
image = Image.open('captcha.jpg')
# 转换为灰度图像
gray_image = image.convert('L')
# 二值化处理
threshold = 127
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
binary_image = image.point(table, '1')

3. 使用OCR进行识别

经过预处理后,我们可以使用pytesseract将图片转换为文本。

# 使用pytesseract进行识别
text = pytesseract.image_to_string(binary_image)
print('识别结果:', text)

4. 完整代码示例

以下是一个完整的示例代码,展示了从下载验证码图片到识别文本的全过程。

import requests
from PIL import Image
import pytesseract
 
# 设置tesseract可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
 
# 下载验证码图片
url = 'https://example.com/captcha'  # 替换为实际的验证码URL
response = requests.get(url)
with open('captcha.jpg', 'wb') as f:
    f.write(response.content)
 
# 打开图片并进行预处理
image = Image.open('captcha.jpg')
gray_image = image.convert('L')
threshold = 127
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
binary_image = image.point(table, '1')
 
# 使用pytesseract进行识别
text = pytesseract.image_to_string(binary_image)
print('识别结果:', text)

四、处理复杂验证码

对于一些复杂的验证码,如带有旋转、拼图、滑动等元素的验证码,OCR技术可能无法直接识别。这时,我们可以借助一些专业的打码平台。

打码平台是一种提供验证码识别服务的第三方平台,它们通常有专业的人工或机器来识别各种类型的验证码,然后通过API接口返回结果。当然,这种服务是需要付费的,价格根据验证码的难度和数量而不同。

Python中有多个打码平台的库可以使用,如chaojiying、yundama、ruokuai等。它们都提供了相应的API文档和示例代码,方便我们在Python中调用。

1. 注册并充值打码平台账号
首先,我们需要在打码平台上注册账号,并进行充值。充值后,我们可以获得API密钥和API接口地址。

2. 安装并导入打码平台库
以chaojiying为例,我们可以使用pip安装chaojiying的Python库。

pip install chaojiying

安装完成后,在Python代码中导入该库。

from chaojiying import Chaojiying_Client

3. 调用打码平台API进行识别

接下来,我们可以使用打码平台的API进行验证码识别。以下是一个示例代码。

from chaojiying import Chaojiying_Client
import requests
 
# 打码平台账号信息
username = 'your_username'  # 替换为你的账号
password = 'your_password'  # 替换为你的密码
soft_id = 'your_soft_id'    # 替换为你的软件ID
 
# 初始化打码平台客户端
client = Chaojiying_Client(username, password, soft_id)
 
# 下载验证码图片
url = 'https://example.com/captcha'  # 替换为实际的验证码URL
response = requests.get(url)
with open('captcha.jpg', 'wb') as f:
    f.write(response.content)
 
# 调用打码平台API进行识别
im_path = 'captcha.jpg'
result = client.PostPic(im_path, '')
 
# 解析识别结果
if result['err_no'] == 0:
    print('识别结果:', result['pic_str'])
else:
    print('识别失败:', result['err_msg'])

五、案例:识别古诗文网验证码

以下是一个具体的案例,展示了如何使用Python识别古诗文网的验证码。

import requests
from PIL import Image
import pytesseract
 
# 设置tesseract可执行文件的路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'
 
# 下载验证码图片
url = 'https://so.gushiwen.org/RandCode.ashx'
response = requests.get(url)
with open('captcha.jpg', 'wb') as f:
    f.write(response.content)
 
# 打开图片并进行预处理
image = Image.open('captcha.jpg')
gray_image = image.convert('L')
threshold = 127
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)
binary_image = image.point(table, '1')
 
# 使用pytesseract进行识别
text = pytesseract.image_to_string(binary_image)
print('识别结果:', text.strip())

六、总结

本文详细介绍了如何使用Python识别和处理验证码。通过OCR技术和打码平台,我们可以实现对简单和复杂验证码的识别。在实际应用中,我们需要根据验证码的类型和难度,选择合适的识别方法,并进行相应的预处理和后处理,以提高识别的准确率和稳定性。

以上就是使用Python识别和处理验证码的代码示例的详细内容,更多关于Python识别和处理验证码的资料请关注脚本之家其它相关文章!

相关文章

  • python 模块导入问题汇总

    python 模块导入问题汇总

    在本篇文章里小编给大家整理的是一篇关于python 模块导入问题汇总内容,有需要的朋友们可以学习参考下。
    2021-02-02
  • python如何提取script的部分内容

    python如何提取script的部分内容

    文章介绍了如何使用Python提取网页中的脚本部分内容,并提供了一个示例脚本,该脚本使用了`requests`库来获取网页内容,并使用`BeautifulSoup`库来解析HTML,提取出`
    2025-02-02
  • python实现web应用框架之增加响应对象

    python实现web应用框架之增加响应对象

    这篇文章主要介绍了python利用web应用框架如何增加响应对象的,文中有相应的代码示例,对大家的学习或工作有一定的参考价值,需要的同学可以参考下
    2023-05-05
  • python PyTorch参数初始化和Finetune

    python PyTorch参数初始化和Finetune

    这篇文章主要介绍了python PyTorch参数初始化和Finetune,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 利用Python如何制作好玩的GIF动图详解

    利用Python如何制作好玩的GIF动图详解

    这篇文章主要给大家介绍了关于利用Python如何制作好玩的GIF动图的相关资料,实现的方法主要利用ImageMagick,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-07-07
  • 图解python全局变量与局部变量相关知识

    图解python全局变量与局部变量相关知识

    这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • python 字典 setdefault()和get()方法比较详解

    python 字典 setdefault()和get()方法比较详解

    这篇文章主要介绍了python 字典 setdefault()和get()方法比较详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Matplotlib绘图基础之刻度详解

    Matplotlib绘图基础之刻度详解

    Matplotlib中刻度是用于在绘图中表示数据大小的工具,通常以整数或小数表示,具体取决于坐标轴的类型和限制,下面就为大家介绍一下Matplotlib中刻度是具体设置与使用吧
    2023-07-07
  • 自适应线性神经网络Adaline的python实现详解

    自适应线性神经网络Adaline的python实现详解

    这篇文章主要介绍了自适应线性神经网络Adaline的python实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Python实现投影法分割图像示例(一)

    Python实现投影法分割图像示例(一)

    今天小编就为大家分享一篇Python实现投影法分割图像示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01

最新评论