Selenium 實(shí)踐(一)-圖片驗(yàn)證碼登錄

文|桃子

一. 實(shí)現(xiàn)場(chǎng)景

1. 要想對(duì)一個(gè)網(wǎng)站內(nèi)容進(jìn)行瀏覽或操作,一般都需要進(jìn)行登錄操作,只有登錄成功后才能進(jìn)行后續(xù)流程,所以本節(jié)主要實(shí)現(xiàn)登錄功能的自動(dòng)化,如下圖

?? 運(yùn)行實(shí)例



二. 操作實(shí)踐

根據(jù)上圖整個(gè)流程我分為以下幾步:

1. 啟用瀏覽器并打開測(cè)試網(wǎng)站

代碼:


啟用瀏覽器并打開測(cè)試網(wǎng)站

釋義如下:

from selenium import webdriver #將webdriver驅(qū)動(dòng)導(dǎo)入selenium框架中from pip._vendor.requests.cookies import get_cookie_header#導(dǎo)入cookie(獲取cookie時(shí)使用)import time#導(dǎo)入時(shí)間包(后續(xù)time函數(shù)使用)chromedriver="C:\Program Files\Google\Chrome\Application\chromedriver.exe"#將chrome驅(qū)動(dòng)地址賦值給chromdriverbrowser=webdriver.Chrome(chromedriver)#調(diào)用chromedriver打開chrome瀏覽器browser.get("https://login.xxxx.com/en?dest_url=https://xxxx.com/en/contact")#打開測(cè)試網(wǎng)站(此網(wǎng)站地址需要填寫自己測(cè)試的網(wǎng)站地址)


2. 對(duì)賬號(hào)、密碼元素定位并輸入內(nèi)容

首先通過F12打開代碼界面,點(diǎn)擊元素定位圖標(biāo),選中要定位的“賬號(hào)”文本框內(nèi)容,在代碼區(qū)域找到定位的元素代碼信息,如下圖中的name名稱“l(fā)ogin”,密碼元素同理


定位的元素代碼

代碼:

browser.find_element_by_name("Login").send_keys("xxxx")#通過name定位登錄文本框,通過send_keys輸入賬戶信息browser.find_element_by_name("Password").send_keys("xxxx")#通過name定位密碼文本框,通過send_keys輸入密碼信息


3. 驗(yàn)證碼處理-使用OCR自動(dòng)識(shí)別

看網(wǎng)上介紹驗(yàn)證碼處理大致有4種方法,1.讓開發(fā)把驗(yàn)證碼代碼注釋掉 2.讓開發(fā)設(shè)置萬(wàn)能驗(yàn)證碼 3.通過添加cookie方式繞過圖片驗(yàn)證碼 4.OCR自動(dòng)識(shí)別,其中1-2因?yàn)檫@個(gè)網(wǎng)站與開發(fā)接觸不到,不予考慮方法3一般適用于記住登錄狀態(tài)的網(wǎng)站才適合,這里我使用第4種方法,這種方法適合于處理比較簡(jiǎn)單的驗(yàn)證碼

OCR自動(dòng)識(shí)別的原理是什么呢?

在這里我們需要使用pytesseract,它是一款用于光學(xué)字符識(shí)別(OCR)的python工具,即從圖片中識(shí)別出其中嵌入的文字。整個(gè)過程分為截取登錄頁(yè)面->獲取驗(yàn)證碼的位置坐標(biāo)->打開截圖->從截圖中截取驗(yàn)證碼的區(qū)域->使用pytesseract工具識(shí)別驗(yàn)證碼

代碼:

browser.save_screenshot('f://a.png')#截取當(dāng)前網(wǎng)頁(yè),該網(wǎng)頁(yè)有我們需要的驗(yàn)證碼yzm=browser.find_element_by_id("captcha_img_id") #定位驗(yàn)證碼location=yzm.location#獲取驗(yàn)證碼x,y軸坐標(biāo)size=yzm.size#獲取驗(yàn)證碼的長(zhǎng)寬rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))#截取的位置坐標(biāo)i=Image.open("f://a.png") #打開截圖frame4=i.crop(rangle) #使用Image的crop函數(shù),從截圖中再次截取我們需要的區(qū)域frame4.save('f://frame4.jpg')#將截取到的驗(yàn)證碼保存為jpg圖片qq=Image.open('f://frame4.jpg')#打開jpg驗(yàn)證碼圖片text=pytesseract.image_to_string(qq).strip() #使用image_to_string識(shí)別驗(yàn)證碼browser.find_element_by_name("turing").send_keys(text)#將識(shí)別的圖片驗(yàn)證碼信息輸入到驗(yàn)證碼輸入文本框中browser.find_element_by_class_name("btn").click()#點(diǎn)擊登錄按鈕


運(yùn)行代碼后可能會(huì)遇到提示“系統(tǒng)找不到指定文件”

這個(gè)問題困擾了我好久,最后處理方案如下:

首先保證pytesseract環(huán)境安裝正確-參見pytesseract環(huán)境安裝文章:

https://www.cnblogs.com/hupeng1234/p/7136442.html

其次,打開文件 pytesseract.py,找到如下代碼,將tesseract_cmd的值修改為全路徑如:

tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract'

? ? ? #這里一定要用\\不能用\,在程序里\\表示轉(zhuǎn)譯,如果只使用\是沒用的。

運(yùn)行代碼,圖1中的整個(gè)自動(dòng)登錄功能就實(shí)現(xiàn)了,怎么樣有沒有一種要飛的感覺…



三. 完整代碼


# coding=gbk'''Created on 2018年2月23日@author: wx'''#!/usr/bin/python# -*-encoding:utf-8 -*-#1.啟用瀏覽器并打開測(cè)試網(wǎng)站from PIL import Imageimport pytesseractfrom selenium import webdriver #將webdriver驅(qū)動(dòng)導(dǎo)入selenium框架中from pip._vendor.requests.cookies import get_cookie_header#導(dǎo)入cookieimport time#導(dǎo)入時(shí)間包from pydoc import browsefrom pip import locationsfrom test.test_largefile import sizechromedriver="C:\Program Files\Google\Chrome\Application\chromedriver.exe"#將chrome驅(qū)動(dòng)地址賦值給chromdriverbrowser=webdriver.Chrome(chromedriver)#調(diào)用chromedriver打開chrome瀏覽器browser.get("https://login.acesse.com/en?dest_url=https://acesse.com/en/contact")#打開測(cè)試網(wǎng)站#2.對(duì)賬號(hào)、密碼元素進(jìn)行定位browser.find_element_by_name("Login").send_keys("542769")browser.find_element_by_name("Password").send_keys("921221tt")#3.驗(yàn)證碼處理-使用OCR自動(dòng)識(shí)別#browser.maximize_window()browser.save_screenshot('f://a.png')#截取當(dāng)前網(wǎng)頁(yè),該網(wǎng)頁(yè)有我們需要的驗(yàn)證碼yzm=browser.find_element_by_id("captcha_img_id") #定位驗(yàn)證碼location=yzm.location#獲取驗(yàn)證碼x,y軸坐標(biāo)size=yzm.size#獲取驗(yàn)證碼的長(zhǎng)寬rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height']))#截取的位置坐標(biāo)i=Image.open("f://a.png") #打開截圖frame4=i.crop(rangle) #使用Image的crop函數(shù),從截圖中再次截取我們需要的區(qū)域frame4.save('f://frame4.jpg')#講截取到的驗(yàn)證碼保存為jpg圖片qq=Image.open('f://frame4.jpg')#打開jpg驗(yàn)證碼圖片text=pytesseract.image_to_string(qq).strip()#使用image_to_string識(shí)別驗(yàn)證碼browser.find_element_by_name("turing").send_keys(text)#將識(shí)別的圖片驗(yàn)證碼信息輸入到驗(yàn)證碼輸入文本框中browser.find_element_by_class_name("btn").click()#點(diǎn)擊登錄按鈕



四. 使用到的技術(shù)

最后總結(jié)下我們這里使用到的技術(shù):

1. 元素定位:find_element_by_name、find_element_by_id等方法

2. 鍵盤、鼠標(biāo)操作:send_keys(輸入內(nèi)容)、click()點(diǎn)擊

3. OCR自動(dòng)識(shí)別-識(shí)別驗(yàn)證碼圖片,識(shí)別過程:截取登錄頁(yè)面->獲取驗(yàn)證碼的位置坐標(biāo)->打開截圖->從截圖中截取驗(yàn)證碼的區(qū)域->使用pytesseract工具識(shí)別驗(yàn)證碼

代碼運(yùn)行過程中,可以發(fā)現(xiàn)登錄過程中有的時(shí)候圖片還沒完全加載出來(lái)就進(jìn)行圖片識(shí)別,導(dǎo)致識(shí)別失敗,有關(guān)這個(gè)問題參考下一篇文章《Selenium 實(shí)踐(二)-設(shè)置等待時(shí)間》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容