ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-03 19:03:27  阅读:225  来源: 互联网

标签:image selenium 验证码 captcha import 图形 OCR browser


一、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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有