OCR识别

一、背景

        登录不再是简单的账号密码登录,普通爬取方式不适用时,比如需要验证码的登录场景,这段代码是一个基于 DrissionPage 和其他 Python 库的自动化脚本,主要用于登录一个网站、执行特定的数据抓取操作,并将抓取到的数据保存到 Excel 文件中。

二、前期准备

1、了解ddddocr库:用于验证码识别

2、其他库的了解学习内容

  • DrissionPage: 用于浏览器自动化操作(类似于 Selenium)。
  • pyautogui: 用于桌面自动化,比如截图。
  • pandas: 用于处理数据并导出到 Excel 文件。
  • time: 用于添加延迟。
  • cv2 (OpenCV):用于图像处理和模板匹配。
  • os: 用于文件和路径操作。

三、实现方式 

1、用ddddocr实现简单识别,代码如下:

import ddddocr

def recognize_captcha(image_path):
    """
    识别验证码,包含预处理和识别步骤。
    """
    ocr = ddddocr.DdddOcr(beta=True)

    # 将图像转换为二进制格式
    with open('.\\pic\\target.png', 'rb') as f:
        img_bytes = f.read()

    # 调用 ddddocr 进行识别
    result = ocr.classification(img_bytes,png_fix=True)
    return result

if __name__ == '__main__':
    # 输入图片路径
    image_path = '.\\pic\\target.png'
    
    # 识别验证码并输出结果
    result = recognize_captcha(image_path)
    print("验证码识别结果:", result)

2、初改版本

import time
import requests
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException

# 配置文件或参数化选择器
selectors = {
    'username_input': '#pd-form-username',  # 可以通过配置文件或命令行参数动态指定
    'password_input': '#pd-form-password',
    'login_button': '#pd-form-login-button'
}

def login(driver, url, username, password, max_retries=3):
    """
    尝试登录网站,支持重试机制。
    """
    retries = 0
    while retries < max_retries:
        try:
            driver.get(url)
            time.sleep(2)  # 等待页面加载

            # 输入用户名和密码
            username_input = driver.find_element('css selector', selectors['username_input'])
            password_input = driver.find_element('css selector', selectors['password_input'])
            username_input.clear()
            username_input.send_keys(username)
            password_input.clear()
            password_input.send_keys(password)

            # 点击登录按钮
            login_button = driver.find_element('css selector', selectors['login_button'])
            login_button.click()

            # 检查是否登录成功(这里可以添加更具体的检查逻辑)
            time.sleep(5)  # 等待登录结果
            # 假设登录成功后URL会发生变化,或者某个元素会出现
            # 这里只是示例,具体逻辑需要根据实际页面调整
            if 'dashboard' in driver.current_url:  # 假设登录成功后会跳转到dashboard页面
                print("登录成功")
                return True
            else:
                print("登录失败,重试中...")
                retries += 1

        except NoSuchElementException as e:
            print(f"元素未找到: {e}")
            break  # 或者可以选择重试,但这里我们假设元素不存在是致命错误
        except WebDriverException as e:
            print(f"WebDriver异常: {e}")
            retries += 1  # WebDriver异常可以尝试重试
        except Exception as e:
            print(f"发生未知异常: {e}")
            break  # 未知异常通常不应该重试

    print("登录失败,已达到最大重试次数")
    return False

def main():
    url = 'https://example.com/login'
    username = 'your_username'
    password = 'your_password'

    # 初始化WebDriver(这里以Chrome为例)
    driver = webdriver.Chrome()  # 确保已经安装了ChromeDriver,并且路径已添加到系统PATH中

    try:
        if not login(driver, url, username, password):
            print("无法登录,脚本终止")
        else:
            # 登录成功后的操作
            print("执行登录成功后的操作")
    finally:
        driver.quit()  # 确保WebDriver在脚本结束时关闭

if __name__ == "__main__":
    main()

3、最终优化代码

import time
import requests
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException, WebDriverException
import openpyxl

# 配置文件或参数化选择器
selectors = {
    'username_input': '#pd-form-username',  # 可以通过配置文件或命令行参数动态指定
    'password_input': '#pd-form-password',
    'login_button': '#pd-form-login-button'
}

def login(driver, url, username, password, max_retries=3):
    """
    尝试登录网站,支持重试机制。
    """
    retries = 0
    while retries < max_retries:
        try:
            driver.get(url)
            time.sleep(2)  # 等待页面加载

            # 输入用户名和密码
            username_input = driver.find_element('css selector', selectors['username_input'])
            password_input = driver.find_element('css selector', selectors['password_input'])
            username_input.clear()
            username_input.send_keys(username)
            password_input.clear()
            password_input.send_keys(password)

            # 点击登录按钮
            login_button = driver.find_element('css selector', selectors['login_button'])
            login_button.click()

            # 检查是否登录成功(这里可以添加更具体的检查逻辑)
            time.sleep(5)  # 等待登录结果
            if 'dashboard' in driver.current_url:  # 假设登录成功后会跳转到dashboard页面
                print("登录成功")
                return True
            else:
                print("登录失败,重试中...")
                retries += 1

        except NoSuchElementException as e:
            print(f"元素未找到: {e}")
            break
        except WebDriverException as e:
            print(f"WebDriver异常: {e}")
            retries += 1
        except Exception as e:
            print(f"发生未知异常: {e}")
            break

    print("登录失败,已达到最大重试次数")
    return False

def write_to_excel(file_path, data):
    """
    将数据写入Excel文件。
    """
    try:
        workbook = openpyxl.load_workbook(file_path)
        sheet = workbook.active
    except FileNotFoundError:
        workbook = openpyxl.Workbook()
        sheet = workbook.active
        sheet.append(["用户名", "密码", "登录结果"])  # 添加表头

    sheet.append(data)  # 添加数据行
    workbook.save(file_path)
    print(f"数据已写入 {file_path}")

def main():
    url = 'https://example.com/login'
    username = 'your_username'
    password = 'your_password'
    excel_file_path = 'login_results.xlsx'

    # 初始化WebDriver(这里以Chrome为例)
    driver = webdriver.Chrome()  # 确保已经安装了ChromeDriver,并且路径已添加到系统PATH中

    try:
        login_success = login(driver, url, username, password)
        login_result = "成功" if login_success else "失败"
        data = [username, password, login_result]
        write_to_excel(excel_file_path, data)

        if login_success:
            # 登录成功后的操作
            print("执行登录成功后的操作")
        else:
            print("无法登录,脚本终止")
    finally:
        driver.quit()  # 确保WebDriver在脚本结束时关闭

if __name__ == "__main__":
    main()

代码说明:

  1. 参数化选择器:通过字典 selectors 来存储元素选择器,使脚本更易于配置和适用于不同的网站。

  2. 异常处理:增加了对 NoSuchElementException 和 WebDriverException 的捕获,并给出了相应的错误提示。对于未知异常,也进行了捕获并打印了错误信息。

  3. 避免递归调用:使用 while 循环和重试机制来替代递归调用,避免了栈溢出的风险。

  4. 登录成功检查:添加了简单的登录成功检查逻辑(这里只是示例,具体逻辑需要根据实际页面调整)。

  5. 写入 Excel 文件:增加了 write_to_excel 函数,用于将数据写入 Excel 文件。如果文件不存在,会创建一个新的文件并添加表头。

  6. 数据记录:在 main 函数中,根据登录结果将数据(用户名、密码、登录结果)写入 Excel 文件

你可能感兴趣的:(ocr,java,前端)