做了個(gè)網(wǎng)站 怎么做seo百度網(wǎng)盤網(wǎng)頁版登錄首頁
文章目錄
- 專欄導(dǎo)讀
- 一、前言
- 二、ddddocr庫使用說明
- 1. 介紹
- 2. 算法步驟
- 3. 安裝
- 4. 參數(shù)說明
- 5. 純數(shù)字驗(yàn)證碼識(shí)別
- 6. 純英文驗(yàn)證碼識(shí)別
- 7. 英文數(shù)字驗(yàn)證碼識(shí)別
- 8. 帶干擾的驗(yàn)證碼識(shí)別
- 三、驗(yàn)證碼識(shí)別登錄代碼實(shí)戰(zhàn)
- 1. 輸入賬號(hào)密碼
- 2. 下載驗(yàn)證碼
- 3. 識(shí)別驗(yàn)證碼并登錄
- 書籍推薦
專欄導(dǎo)讀
🔥🔥本文已收錄于《100天精通Python從入門到就業(yè)》:本專欄專門針對(duì)零基礎(chǔ)和需要進(jìn)階提升的同學(xué)所準(zhǔn)備的一套完整教學(xué),從0到100的不斷進(jìn)階深入,后續(xù)還有實(shí)戰(zhàn)項(xiàng)目,輕松應(yīng)對(duì)面試,專欄訂閱地址:https://blog.csdn.net/yuan2019035055/category_11466020.html
- 優(yōu)點(diǎn):訂閱限時(shí)9.9付費(fèi)專欄進(jìn)入千人全棧VIP答疑群,作者優(yōu)先解答機(jī)會(huì)(代碼指導(dǎo)、遠(yuǎn)程服務(wù)),群里大佬眾多可以抱團(tuán)取暖(大廠內(nèi)推機(jī)會(huì))
- 專欄福利:簡(jiǎn)歷指導(dǎo)、招聘內(nèi)推、每周送實(shí)體書、80G全棧學(xué)習(xí)視頻、300本IT電子書:Python、Java、前端、大數(shù)據(jù)、數(shù)據(jù)庫、算法、爬蟲、數(shù)據(jù)分析、機(jī)器學(xué)習(xí)、面試題庫等等
一、前言
兄弟們使用selenium自動(dòng)登錄網(wǎng)站的時(shí)候,是不是經(jīng)常遇到數(shù)字驗(yàn)證碼,使用傳統(tǒng)的OCR庫識(shí)別效果又不是很好,今天介紹一款效果非常棒的驗(yàn)證碼識(shí)別模塊——ddddocr。
二、ddddocr庫使用說明
1. 介紹
ddddocr(帶帶弟弟ocr)是一個(gè)用于文字識(shí)別的開源庫。它是基于深度學(xué)習(xí)技術(shù)的,具有高度的準(zhǔn)確性和魯棒性。ddddocr使用了深度神經(jīng)網(wǎng)絡(luò)來處理各種類型的文本,包括印刷體和手寫體等。其雙解碼機(jī)制使其在處理復(fù)雜文本時(shí)表現(xiàn)出色。
這個(gè)庫的特點(diǎn)之一是其模型結(jié)構(gòu)的密集性(Dense),這意味著它能夠更好地捕捉文本中的細(xì)節(jié)和特征,從而提高了識(shí)別的準(zhǔn)確性。此外,它還采用了雙解碼機(jī)制(Dual Decode),這意味著它可以同時(shí)從多個(gè)角度對(duì)圖像進(jìn)行解碼,進(jìn)一步提高了識(shí)別的魯棒性和準(zhǔn)確性。
Github地址:https://github.com/sml2h3/ddddocr
2. 算法步驟
ddddocr這個(gè)庫的算法主要包括以下幾個(gè)步驟:
-
圖像預(yù)處理:
- 圖像預(yù)處理是任何OCR系統(tǒng)中的第一步。它旨在使圖像更容易處理,并提高文本識(shí)別的準(zhǔn)確性。預(yù)處理步驟可能包括灰度化、二值化、去噪聲、圖像增強(qiáng)等操作,以減少后續(xù)步驟中的噪聲和干擾。
-
文本檢測(cè):
- 文本檢測(cè)是指識(shí)別圖像中文本的位置和邊界框。這一步通常使用深度學(xué)習(xí)技術(shù),如卷積神經(jīng)網(wǎng)絡(luò) (CNN) 或循環(huán)神經(jīng)網(wǎng)絡(luò) (RNN) 來實(shí)現(xiàn)。檢測(cè)到的文本通常用矩形邊界框表示。
-
文本識(shí)別:
- 文本識(shí)別是從檢測(cè)到的文本區(qū)域中提取出實(shí)際的文本內(nèi)容。這通常涉及到使用循環(huán)神經(jīng)網(wǎng)絡(luò) (RNN)、注意力機(jī)制或轉(zhuǎn)錄網(wǎng)絡(luò)等模型來識(shí)別文本。這些模型可以是基于字符的,也可以是基于單詞或子詞的。
-
后處理:
- 后處理步驟旨在提高識(shí)別準(zhǔn)確性并改善結(jié)果的質(zhì)量。這可能包括語言模型的應(yīng)用、糾正錯(cuò)誤、識(shí)別字體或手寫風(fēng)格等。
-
輸出結(jié)果:
- 最終結(jié)果通常以文本形式呈現(xiàn),或者以標(biāo)記文本的邊界框和對(duì)應(yīng)的文本內(nèi)容的形式提供。
ddddOCR庫可能會(huì)結(jié)合這些步驟,利用深度學(xué)習(xí)模型和傳統(tǒng)的計(jì)算機(jī)視覺技術(shù)來實(shí)現(xiàn)文本識(shí)別。在不同的應(yīng)用場(chǎng)景下,可能會(huì)有一些額外的步驟或優(yōu)化,比如針對(duì)特定的文檔類型進(jìn)行優(yōu)化、處理不同語言的文本等。
3. 安裝
硬性要求 Python >= 3.8,通過pip命令進(jìn)行安裝:
pip install ddddocr
4. 參數(shù)說明
我們這里使用的是ddddocr.DdddOcr()
類:
class DdddOcr(object):def __init__(self, ocr: bool = True, det: bool = False, old: bool = False, beta: bool = False,use_gpu: bool = False,device_id: int = 0, show_ad=True, import_onnx_path: str = "", charsets_path: str = "")
這個(gè)__init__
方法是一個(gè)Python類的構(gòu)造函數(shù),它定義了類的初始化過程,其中包含了一系列參數(shù)。讓我來解釋一下這些參數(shù)的含義:
-
ocr
: 這是一個(gè)布爾類型的參數(shù),用于指定是否進(jìn)行光學(xué)字符識(shí)別(OCR)。默認(rèn)值為True,表示默認(rèn)情況下會(huì)進(jìn)行OCR。 -
det
: 這也是一個(gè)布爾類型的參數(shù),用于指定是否進(jìn)行文本檢測(cè)(Text Detection)。默認(rèn)值為False,表示默認(rèn)情況下不會(huì)進(jìn)行文本檢測(cè)。 -
old
: 這是一個(gè)布爾類型的參數(shù),用于指定是否使用舊版本的模型或方法。默認(rèn)值為False,表示默認(rèn)情況下不使用舊版本。 -
beta
: 這也是一個(gè)布爾類型的參數(shù),用于指定是否使用測(cè)試版本(beta版本)的功能或方法。默認(rèn)值為False,表示默認(rèn)情況下不使用測(cè)試版本。 -
use_gpu
: 這是一個(gè)布爾類型的參數(shù),用于指定是否使用GPU來進(jìn)行計(jì)算。默認(rèn)值為False,表示默認(rèn)情況下不使用GPU,而使用CPU。 -
device_id
: 這是一個(gè)整數(shù)類型的參數(shù),用于指定在使用GPU時(shí)要使用的GPU設(shè)備的ID。默認(rèn)值為0,表示默認(rèn)情況下使用ID為0的GPU設(shè)備。 -
show_ad
: 這是一個(gè)布爾類型的參數(shù),用于指定是否顯示廣告。默認(rèn)值為True,表示默認(rèn)情況下會(huì)顯示廣告。 -
import_onnx_path
: 這是一個(gè)字符串類型的參數(shù),用于指定導(dǎo)入ONNX模型的路徑。默認(rèn)值為空字符串,表示默認(rèn)情況下不導(dǎo)入任何ONNX模型。 -
charsets_path
: 這是一個(gè)字符串類型的參數(shù),用于指定字符集的路徑。默認(rèn)值為空字符串,表示默認(rèn)情況下字符集的路徑未指定。
這個(gè)類中有一個(gè)classification
方法,需要傳遞一個(gè)圖片對(duì)象進(jìn)入就可以識(shí)別了:
def classification(self, img, png_fix: bool = False):if self.det:raise TypeError("當(dāng)前識(shí)別類型為目標(biāo)檢測(cè)")if not isinstance(img, (bytes, str, pathlib.PurePath, Image.Image)):raise TypeError("未知圖片類型")if isinstance(img, bytes):image = Image.open(io.BytesIO(img))elif isinstance(img, Image.Image):image = img.copy()elif isinstance(img, str):image = base64_to_image(img)else:assert isinstance(img, pathlib.PurePath)image = Image.open(img)if not self.use_import_onnx:image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert('L')else:if self.__resize[0] == -1:if self.__word:image = image.resize((self.__resize[1], self.__resize[1]), Image.ANTIALIAS)else:image = image.resize((int(image.size[0] * (self.__resize[1] / image.size[1])), self.__resize[1]),Image.ANTIALIAS)else:image = image.resize((self.__resize[0], self.__resize[1]), Image.ANTIALIAS)if self.__channel == 1:image = image.convert('L')else:if png_fix:image = png_rgba_black_preprocess(image)else:image = image.convert('RGB')image = np.array(image).astype(np.float32)image = np.expand_dims(image, axis=0) / 255.if not self.use_import_onnx:image = (image - 0.5) / 0.5else:if self.__channel == 1:image = (image - 0.456) / 0.224else:image = (image - np.array([0.485, 0.456, 0.406])) / np.array([0.229, 0.224, 0.225])image = image[0]image = image.transpose((2, 0, 1))ort_inputs = {'input1': np.array([image]).astype(np.float32)}ort_outs = self.__ort_session.run(None, ort_inputs)result = []
5. 純數(shù)字驗(yàn)證碼識(shí)別
測(cè)試圖片:
測(cè)試代碼:
import ddddocr
import timestart = time.time() # 開始時(shí)間# 1. 創(chuàng)建DdddOcr對(duì)象
ocr = ddddocr.DdddOcr(show_ad=False)# 2. 讀取圖片
with open('test.png', 'rb') as f:img = f.read()# 3. 識(shí)別圖片內(nèi)驗(yàn)證碼并返回字符串
result = ocr.classification(img)
print("識(shí)別結(jié)果:",result)end = time.time()
print("耗時(shí):%s 秒" % str(start-end))
運(yùn)行結(jié)果:
識(shí)別結(jié)果: 0413
耗時(shí):-0.12942123413085938 秒
6. 純英文驗(yàn)證碼識(shí)別
測(cè)試圖片:
運(yùn)行結(jié)果:
識(shí)別結(jié)果: bcsm
耗時(shí):-0.11309981346130371 秒
7. 英文數(shù)字驗(yàn)證碼識(shí)別
測(cè)試圖片:
運(yùn)行結(jié)果:
識(shí)別結(jié)果: a72c
耗時(shí):-0.09667587280273438 秒
8. 帶干擾的驗(yàn)證碼識(shí)別
測(cè)試圖片:
運(yùn)行結(jié)果:
識(shí)別結(jié)果: i27kYk
耗時(shí):-0.09169244766235352 秒
可以看到ddddocr庫識(shí)別驗(yàn)證碼還是特別給力的!!!
三、驗(yàn)證碼識(shí)別登錄代碼實(shí)戰(zhàn)
上一期我們講了如何使用selenium輸入賬號(hào)信息登錄網(wǎng)站,還不會(huì)的可以去復(fù)習(xí)一下:https://blog.csdn.net/yuan2019035055/article/details/136284263
測(cè)試網(wǎng)站:https://captcha7.scrape.center/
1. 輸入賬號(hào)密碼
運(yùn)行下面代碼將會(huì)輸入賬號(hào)密碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 1. 創(chuàng)建鏈接
# 創(chuàng)建ChromeOptions對(duì)象,用于配置Chrome瀏覽器的選項(xiàng)
chrome_options = webdriver.ChromeOptions()
# 添加啟動(dòng)參數(shù),'--disable-gpu'參數(shù)用于禁用GPU加速,適用于部分平臺(tái)上的兼容性問題
chrome_options.add_argument('--disable-gpu')# 2. 添加請(qǐng)求頭偽裝瀏覽器
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)# 3. 執(zhí)行 `stealth.min.js` 文件進(jìn)行隱藏瀏覽器指紋
with open('stealth.min.js') as f:js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js
})# 4. 最大化瀏覽器窗口
driver.maximize_window()# 5. 發(fā)送請(qǐng)求,打開網(wǎng)頁
driver.get('https://captcha7.scrape.center/')
time.sleep(1)# 6. 輸入賬號(hào)密碼
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位賬號(hào)框
username_input.send_keys("your_username") # 輸入賬號(hào)信息(這里自行替換)password_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密碼框
password_input .send_keys("your_username") # 輸入密碼信息(這里自行替換)time.sleep(100)
運(yùn)行結(jié)果:
2. 下載驗(yàn)證碼
1、先找到驗(yàn)證碼圖片的ID:
ID為:
captcha
2、定位驗(yàn)證碼:
element = driver.find_element(By.ID, 'captcha') # 定位驗(yàn)證碼
3、使用screenshot('test.png')
方法保存截圖在本地:
element.screenshot('test.png') # 保存截圖
完整代碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time# 1. 創(chuàng)建鏈接
# 創(chuàng)建ChromeOptions對(duì)象,用于配置Chrome瀏覽器的選項(xiàng)
chrome_options = webdriver.ChromeOptions()
# 添加啟動(dòng)參數(shù),'--disable-gpu'參數(shù)用于禁用GPU加速,適用于部分平臺(tái)上的兼容性問題
chrome_options.add_argument('--disable-gpu')# 2. 添加請(qǐng)求頭偽裝瀏覽器
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)# 3. 執(zhí)行 `stealth.min.js` 文件進(jìn)行隱藏瀏覽器指紋
with open('stealth.min.js') as f:js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js
})# 4. 最大化瀏覽器窗口
driver.maximize_window()# 5. 發(fā)送請(qǐng)求,打開網(wǎng)頁
driver.get('https://captcha7.scrape.center/')
time.sleep(1)# 6. 輸入賬號(hào)密碼
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位賬號(hào)框
username_input.send_keys("your_username") # 輸入賬號(hào)信息(這里自行替換)password_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密碼框
password_input .send_keys("your_username") # 輸入密碼信息(這里自行替換)# 7. 下載驗(yàn)證碼
element = driver.find_element(By.ID, 'captcha') # 定位驗(yàn)證碼
element.screenshot('test.png') # 保存截圖
運(yùn)行結(jié)束就會(huì)在當(dāng)前路徑下保存驗(yàn)證碼圖片:
注意:當(dāng)網(wǎng)站的驗(yàn)證碼圖片沒法定位下載的時(shí)候,可以使用Python定位屏幕指定位置截圖的模塊,如:pyautogui
等等,進(jìn)行截圖下載驗(yàn)證碼圖片
3. 識(shí)別驗(yàn)證碼并登錄
接下來需要識(shí)別驗(yàn)證碼內(nèi)容,定位驗(yàn)證碼文本框,輸入驗(yàn)證碼,點(diǎn)擊登錄,完整代碼如下:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import ddddocr# 1. 創(chuàng)建鏈接
# 創(chuàng)建ChromeOptions對(duì)象,用于配置Chrome瀏覽器的選項(xiàng)
chrome_options = webdriver.ChromeOptions()
# 添加啟動(dòng)參數(shù),'--disable-gpu'參數(shù)用于禁用GPU加速,適用于部分平臺(tái)上的兼容性問題
chrome_options.add_argument('--disable-gpu')# 2. 添加請(qǐng)求頭偽裝瀏覽器
chrome_options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36')
driver = webdriver.Chrome(chrome_options=chrome_options)# 3. 執(zhí)行 `stealth.min.js` 文件進(jìn)行隱藏瀏覽器指紋
with open('stealth.min.js') as f:js = f.read()
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": js
})# 4. 最大化瀏覽器窗口
driver.maximize_window()# 5. 發(fā)送請(qǐng)求,打開網(wǎng)頁
driver.get('https://captcha7.scrape.center/')
time.sleep(1)# 6. 輸入賬號(hào)密碼
username_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip username item el-input']/input") # 定位賬號(hào)框
username_input.send_keys("your_username") # 輸入賬號(hào)信息(這里自行替換)password_input = driver.find_element(by=By.XPATH, value="//div[@class='el-tooltip password item el-input']/input") # 定位密碼框
password_input .send_keys("your_username") # 輸入密碼信息(這里自行替換)# 7. 下載驗(yàn)證碼
element = driver.find_element(By.ID, 'captcha') # 定位驗(yàn)證碼
element.screenshot('test.png') # 保存截圖# 8. 識(shí)別驗(yàn)證碼
# 創(chuàng)建DdddOcr對(duì)象
ocr = ddddocr.DdddOcr(show_ad=False)
# 讀取圖片
with open('test.png', 'rb') as f:img = f.read()
# 識(shí)別圖片內(nèi)驗(yàn)證碼并返回字符串
result = ocr.classification(img)
print("識(shí)別結(jié)果:",result)# 9. 輸入驗(yàn)證碼
yzm = driver.find_element(by=By.XPATH, value="//div[@class='captcha el-input']/input") # 定位賬號(hào)框
yzm.clear() # 清空默認(rèn)文本
yzm.send_keys(result)# 10. 點(diǎn)擊登錄按鈕元素
login_button = driver.find_element(by=By.XPATH, value="//button[@class='el-button login el-button--primary']")
# 點(diǎn)擊登錄按鈕
login_button.click()time.sleep(100)
運(yùn)行結(jié)果:
書籍推薦
《Python機(jī)器學(xué)習(xí) 》
《Python機(jī)器學(xué)習(xí)》首先介紹Python機(jī)器學(xué)習(xí)的一些基本庫,包括NumPy、Pandas和matplotlib。一旦牢固地掌握了基礎(chǔ)知識(shí),即可開始基于Python和Scikit-learn庫進(jìn)行機(jī)器學(xué)習(xí),深入了解各種機(jī)器學(xué)習(xí)算法(如回歸、聚類和分類)的底層工作原理。本書專門用一章的篇幅講解如何使用Azure Machine Learning Studio進(jìn)行機(jī)器學(xué)習(xí);利用該平臺(tái),開發(fā)人員不必編寫代碼即可開始構(gòu)建機(jī)器學(xué)習(xí)模型。本書最后討論如何部署供客戶端應(yīng)用程序使用的已構(gòu)建模型。
《Python機(jī)器學(xué)習(xí)》面向機(jī)器學(xué)習(xí)新手,主要內(nèi)容如下:
● Python機(jī)器學(xué)習(xí)的一些基本庫,包括NumPy、Pandas和matplotlib庫
● 常見的機(jī)器學(xué)習(xí)算法,包括回歸、聚類、分類和異常檢測(cè)
● 使用Python和Scikit-learn庫進(jìn)行機(jī)器學(xué)習(xí)
● 將機(jī)器學(xué)習(xí)模型部署為Web服務(wù)
● 使用Microsoft Azure Machine Learning Studio進(jìn)行機(jī)器學(xué)習(xí)
● 演習(xí)機(jī)器學(xué)習(xí)模型構(gòu)建方案的實(shí)例
京東:https://item.jd.com/12672565.html