python 自动识别图形验证码

该博客介绍了如何利用Python的selenium和pytesseract库来识别网页上的验证码。首先,通过Chrome浏览器截图并定位验证码元素,然后裁剪出验证码图片并进行灰度化处理以提高识别准确性。最后,使用pytesseract将图像转换为字符串,实现验证码识别。虽然存在一定的错误识别率,但可通过多次尝试提高成功率。
摘要由CSDN通过智能技术生成

本文以知网注册验证码为例

1. 安装tesseract,并将路径加到环境变量中

下载地址:https://digi.bib.uni-mannheim.de/tesseract/

2. 安装pytesseract 

pip install pytesseract

代码示例

# coding = utf-8

import time

import pytesseract
from PIL import Image

from selenium import webdriver


def get_captcha(driver):
    driver.save_screenshot('./files/screen_shot.png')  # 截屏保存
    check_code = driver.find_element_by_id('checkcode')  # 找到验证码框
    loc = check_code.location  # 验证码的左上角的坐标, x、y    # 找到左上角坐标
    size = check_code.size  # 找到验证码图片的大小,高和宽
    # # print(loc, size)
    image = Image.open('./files/screen_shot.png')  # 打开验证码文件
    rec = (loc['x'], loc['y'], size['width'] + loc['x'], size['height'] + loc['y'])  # 4个坐标。左上角、右下角
    captcha = image.crop(rec)  # 截取对应坐标的图片
    # captcha.show()
    captcha.save('./files/captcha.png')  # 保存截取的验证码区域文件


def recognize_captcha(file):
    gray = Image.open(file).convert('L')  # 灰度化
    # gray.show()
    w, h = gray.size
    data = gray.load()  # 数值化,分配内存加载二维点阵数据
    for i in range(w):
        for j in range(h):  # 点阵里面的值,以128为界,置成0或者255.非黑即白
            if data[i, j] < 128:
                data[i, j] = 0
            else:
                data[i, j] = 255
            # print(data[i, j])

    return pytesseract.image_to_string(gray)  # pytesseract image_to_string 图像识别为字符串


if __name__ == '__main__':
    url = 'https://my.cnki.net/Register/CommonRegister.aspx'
    driver = webdriver.Chrome()
    driver.get(url)
    driver.maximize_window()  # 窗口最大化
    driver.implicitly_wait(5)  # 隐式等待5s

    get_captcha(driver)
    captcha = recognize_captcha('./files/captcha.png')
    print(captcha)
    time.sleep(10)
    driver.quit()

结果:

 

注: 有一定的错误识别率,实际用的时候,如果遇到识别失败的,可以多次获取

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值