
一. 實(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)化,如下圖

二. 操作實(shí)踐
根據(jù)上圖整個(gè)流程我分為以下幾步:
1. 啟用瀏覽器并打開測(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í)間》