首頁 > 軟體

Python通用驗證碼識別OCR庫ddddocr的安裝使用教學

2022-07-06 18:00:55

前言

在使用自動化登入網站的時候,經常輸入使用者名稱和密碼後會遇到驗證碼。今天介紹一款通用驗證碼識別 OCR庫,對驗證碼識別徹底說拜拜,它的名字是 ddddocr(帶帶弟弟 OCR )。這裡主要以字母數位類驗證碼進行說明。

專案地址:https://github.com/sml2h3/ddddocr

一、安裝ddddocr

通過命令將自動安裝符合自己電腦環境的最新 ddddocr。

pip install ddddocr

如果安裝速度慢,可以連線國內映象進行安裝,命令如下:

pip install ddddocr -i https://pypi.tuna.tsinghua.edu.cn/simple/

二、使用ddddocr

1. 使用舉例

import ddddocr

ocr = ddddocr.DdddOcr()
with open('code.png', 'rb') as f:
	img_bytes = f.read()
res = ocr.classification(img_bytes)
print('識別出的驗證碼為:' + res)

2. 完整程式碼

import os
import ddddocr
from time import sleep
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.by import By

class GetVerificationCode:
	def __init__(self):
        self.res = None
        url = '要登入的地址'
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()  # 將瀏覽器最大化
        self.driver.get(url)

	# 獲取驗證碼資訊
    def getVerification(self):
        # 獲取當前檔案的位置、並獲取儲存截圖的位置
        current_location = os.path.dirname(__file__)
        screenshot_path = os.path.join(current_location, "..", "VerificationCode")
        # 擷取當前網頁並放到自定義目錄下,並命名為printscreen,該截圖中有我們需要的驗證碼
        sleep(1)
        self.driver.save_screenshot(screenshot_path + '//' + 'printscreen.png')
        sleep(1)
        # 定位驗證碼
        imgelement = self.driver.find_element(By.XPATH, '驗證碼圖片的Xpath定位')
        # 獲取驗證碼x,y軸座標
        location = imgelement.location
        # 獲取驗證碼的長寬
        size = imgelement.size
        # 寫成我們需要擷取的位置座標
        rangle = (int(location['x'] + 430),
                  int(location['y'] + 200),
                  int(location['x'] + size['width'] + 530),
                  int(location['y'] + size['height'] + 250))
        # 開啟截圖
        i = Image.open(screenshot_path + '//' + 'printscreen.png')
        # 使用Image的crop函數,從截圖中再次擷取我們需要的區域
        fimg = i.crop(rangle)
        fimg = fimg.convert('RGB')
        # 儲存我們截下來的驗證碼圖片,並讀取驗證碼內容
        fimg.save(screenshot_path + '//' + 'code.png')
        ocr = ddddocr.DdddOcr()
        with open(screenshot_path + '//' + 'code.png', 'rb') as f:
            img_bytes = f.read()
        self.res = ocr.classification(img_bytes)
        print('識別出的驗證碼為:' + self.res)

    # 判斷驗證碼錯誤時的提示資訊是否存在
    def isElementPresent(self, by, value):
        try:
            element = self.driver.find_element(by=by, value=value)
        except NoSuchElementException:
            pass
            # 發生了NoSuchElementException異常,說明頁面中未找到該元素,返回False
            return False
        else:
            # 沒有發生異常,表示在頁面中找到了該元素,返回True
            return True

	# 登入
    def login(self):
        self.getVerification()
        self.driver.find_element(By.XPATH, '使用者名稱輸入框Xpath定位').send_keys('使用者名稱')
        self.driver.find_element(By.XPATH, '密碼輸入框Xpath定位').send_keys('密碼')
        self.driver.find_element(By.XPATH, '驗證碼輸入框Xpath定位').send_keys(self.res)
        sleep(1)
        self.driver.find_element(By.XPATH, '登入按鈕Xpath定位').click()
        sleep(2)
		isFlag = True
        while isFlag:
            try:
                isPresent = self.isElementPresent(By.XPATH, '驗證碼錯誤時的提示資訊Xpath定位')
                if isPresent is True:
                    codeText = self.driver.find_element(By.XPATH, '驗證碼錯誤時的提示資訊Xpath定位').text
                    if codeText == "驗證碼不正確":
                        self.getVerification()
                        sleep(2)
                        self.driver.find_element(By.XPATH, '驗證碼輸入框Xpath定位').clear()
                        sleep(1)
                        self.driver.find_element(By.XPATH, '驗證碼輸入框Xpath定位').send_keys(self.res)
                        sleep(1)
                        self.driver.find_element(By.XPATH, '登入按鈕Xpath定位').click()
                        sleep(2)
                    tips = self.driver.find_element(By.XPATH,
                                                    '未輸入驗證碼時的提示資訊Xpath定位').text
                    if tips == "請輸入驗證碼":
                        self.getVerification()
                        sleep(2)
                        self.driver.find_element(By.XPATH, '驗證碼輸入框Xpath定位').click()
                        sleep(1)
                        self.driver.find_element(By.XPATH, '驗證碼輸入框Xpath定位').send_keys(self.res)
                        sleep(1)
                        self.driver.find_element(By.XPATH, '登入按鈕Xpath定位').click()
                        sleep(2)
                    continue
                else:
                    print("驗證碼正確,登入成功!")
            except NoSuchElementException:
                pass
            else:
                isFlag = False
                
        sleep(5)
        self.driver.quit()

if __name__ == '__main__':
    GetVerificationCode().login()

3. 驗證碼樣例

4. 識別結果

可以實現:驗證碼識別錯誤後,繼續識別

三、程式碼說明

本文程式碼中時間等待都是使用了強制等待,如有需要可對程式碼進行修改,可以使用顯示等待。關於selenium的三種等待方式(顯示等待,隱式等待,強制等待)可以參考其他博主的文章瞭解學習。

總結

對於現在已有的驗證碼圖片都有可能具備一定的識別能力。簡單來說,ddddocr 讓驗證碼識別變得如此簡單與易用,可以快速的檢測出圖片上的文字、數位或圖示,讓更多的夥伴能夠快速的破解網站的登入驗證碼。

到此這篇關於Python通用驗證碼識別OCR庫ddddocr的安裝使用教學的文章就介紹到這了,更多相關Python驗證碼識別OCR庫ddddocr內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com