其他分享
首页 > 其他分享> > 使用OCR技术识别图形验证码

使用OCR技术识别图形验证码

作者:互联网

一、OCR技术

OCR,即 Optical Character Recognition,中文叫作光学字符识别,是指通过电子设备检查打印在纸上的字符,通过检查暗、亮的模式确认字符形状,然后通过字符识别方法将形状转换成计算机文字的过程。

那么对于图形验证码来说,它都是一些不规则的字符,但是这些字符确实是由字符稍加扭曲变换得到的内容。

爬虫过程中难免会遇到各种各样的验证码,而大多数验证码还是图形验证码,这时候我们可以直接用 OCR 来识别。

二、整体代码逻辑

1.打开有验证码填写的网站(https://captcha7.scrape.center/);

2.找到用户名输入框,输入用户名;

3.找到密码输入框,输入密码;

4.找到并截取验证码图片,转化为图片对象;

5.预处理验证码图片,去除噪声;

6.识别验证码,得到识别结果;

7.去除识别结果中的一些非字母字符和数字字符;

8.找到验证码输入框,输入验证码结果;

9.点击“登录”按钮;

10.等待“登录成功”的字样出现,如果出现就证明验证码识别正确,否则重复以上步骤。

示例代码:

# -*- UTF-8 -*-
"""
@File:test.py
@Description:
@Author:echohye
@Date:2022/02/03 18:11
"""

import time
import re
import tesserocr
from selenium import webdriver
from io import BytesIO
from PIL import Image
from retrying import retry
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
import numpy as np

def preprocess(image):
    image = image.convert('L')
    array = np.array(image)
    array = np.where(array > 150, 255, 0)
    image = Image.fromarray(array.astype('uint8'))
    return image

@retry(stop_max_attempt_number=10, retry_on_result=lambda x: x is False)
def login():
    browser.get('https://captcha7.scrape.center/')
    browser.find_element(By.CSS_SELECTOR, '.username input[type="text"]').send_keys('admin')
    browser.find_element(By.CSS_SELECTOR, '.password input[type="password"]').send_keys('admin')
    captcha = browser.find_element(By.CSS_SELECTOR, '#captcha')
    image = Image.open(BytesIO(captcha.screenshot_as_png))
    image = preprocess(image)
    captcha = tesserocr.image_to_text(image)
    captcha = re.sub('[^A-Za-z0-9]', '', captcha)
    browser.find_element(By.CSS_SELECTOR, '.captcha input[type="text"]').send_keys(captcha)
    browser.find_element(By.CSS_SELECTOR, '.login').click()
    try:
        WebDriverWait(browser, 3).until(EC.presence_of_element_located((By.XPATH, '//h2[contains(., "登录成功")]')))
        time.sleep(10)
        browser.close()
        return True
    except TimeoutException:
        return False

if __name__ == '__main__':
    browser = webdriver.Chrome()
    login()

selenium运行失败?点击我查看解决方法
tesserocr安装失败?点击我查看解决方法

运行展示


标签:image,selenium,验证码,captcha,import,图形,OCR,browser
来源: https://www.cnblogs.com/echohye/p/15861824.html