selenium驗(yàn)證碼識別之局部截圖

在使用selenium訪問網(wǎng)站概漱,爬取相應(yīng)內(nèi)容時(shí),經(jīng)常需要模擬登陸,現(xiàn)在基本每個(gè)網(wǎng)站登陸都具有驗(yàn)證碼了拔妥,雖然驗(yàn)證碼識別可以利用第三方來完成,但是我們還是需要先獲取驗(yàn)證碼的圖片才可以借助第三方來識別达箍,而在selenium如果你先訪問獲取驗(yàn)證碼后在進(jìn)行二次訪問驗(yàn)證没龙,驗(yàn)證碼是會刷新的,所以我們需要獲取實(shí)時(shí)的驗(yàn)證碼缎玫。下面是獲取識別驗(yàn)證碼的兩種方法硬纤。

一、利用urllib庫來直接獲取驗(yàn)證碼

首先需要安裝urllib庫赃磨,然后利用selenium訪問相應(yīng)網(wǎng)站筝家,對網(wǎng)站進(jìn)行解析,獲取驗(yàn)證碼的url訪問連接邻辉,利用urllib庫通過剛剛的url來獲取圖片的二進(jìn)制數(shù)據(jù)并進(jìn)行儲存溪王。

page_img = urllib.request.urlopen(img_src).read()

這樣就獲取了圖片的二進(jìn)制數(shù)據(jù)了,這是較為簡單的值骇,注意利用這個(gè)方法的時(shí)候還需要導(dǎo)入requests庫莹菱,不然會報(bào)錯(cuò)。
下面是我利用該方法獲取12306網(wǎng)站的驗(yàn)證碼例子的代碼:

from selenium import webdriver
from lxml import etree
import requests
import urllib
from time import sleep

#指定Chrome瀏覽器位置
option = webdriver.ChromeOptions()
option.binary_location = 'E:\\Google Chrome瀏覽器\\Google\\Chrome\\Application\\chrome.exe'

#進(jìn)行偽裝
option.add_experimental_option('excludeSwitches',['enable-automation'])
#生成瀏覽器對象
bro = webdriver.Chrome(executable_path=r'E:\chrome瀏覽器驅(qū)動程序\chromedriver_win32\chromedriver',options=option)

bro.get('https://kyfw.12306.cn/otn/resources/login.html')
sleep(1)
#定位到賬號密碼登錄標(biāo)簽
a_tag = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
#點(diǎn)擊切換為賬號密碼登錄才有驗(yàn)證碼
a_tag.click()
sleep(1)
#獲取頁面源碼
page_text = bro.page_source

#生成etree對象
tree = etree.HTML(page_text)
#獲取驗(yàn)證碼的下載地址
img_src = tree.xpath('//*[@id="J-loginImg"]/@src')[0]
#利用圖片地址獲取圖片二級制數(shù)據(jù)
page_img = urllib.request.urlopen(img_src).read()
#將獲取的二級制數(shù)據(jù)進(jìn)行持久化存儲
with open('img.jpg','wb') as fp:
    fp.write(page_img)

二雷客、利用selenium庫截圖獲取驗(yàn)證碼

該方法比第一種麻煩一點(diǎn)芒珠,首先還是利用selenium訪問網(wǎng)站,注意這樣要設(shè)置瀏覽器窗口最大化搅裙,不然會出現(xiàn)偏差皱卓。

#設(shè)置瀏覽器全屏化
bro.maximize_window()

然后進(jìn)行全局截圖,利用頁面解析定位到驗(yàn)證碼的標(biāo)簽處部逮,調(diào)用location方法獲取驗(yàn)證碼的左上角坐標(biāo)娜汁,再調(diào)用size方法獲取驗(yàn)證碼的寬度和高度,最后得到右下角坐標(biāo)兄朋。然后利用PIL庫中的Image類來打開剛剛截取的全局圖片掐禁,根據(jù)獲取的左上角坐標(biāo)和右下角坐標(biāo)對截圖進(jìn)行裁剪從而獲取驗(yàn)證碼圖片。

location = code_png_lel.location
print('location',location)
#獲取驗(yàn)證碼的長寬
size = code_png_lel.size
print('size',size)
#location獲取是根據(jù)百分之百縮放的颅和,而我電腦的縮放是百分之125所以出現(xiàn)偏差
#圖片左上角和右下角的xy坐標(biāo)
rangle = (
    int(location['x']), int(location['y']), int(location['x']+size['width']), int(location['y']+size['height'])
)
print('rangle',rangle)
#對全局頁面進(jìn)行截圖獲取局部驗(yàn)證碼
i = Image.open('./aa.png')
#按照給定xy坐標(biāo)裁剪
frame = i.crop(rangle)

但是我這樣截圖還是出現(xiàn)偏差了傅事,在網(wǎng)上一查才發(fā)現(xiàn)location方法獲取的坐標(biāo)是按顯示100%時(shí)得到的,而截圖所使用的坐標(biāo)卻是需要根據(jù)顯示縮放比例縮放后對應(yīng)的圖片所確定的峡扩,因此就出現(xiàn)了偏差蹭越。
這就與計(jì)算機(jī)的縮放顯示有關(guān)了,windows可以在桌面右鍵-->顯示設(shè)置-->縮放與布局教届。
若是百分之100就不會有偏差响鹃,我的是百分之125所以有偏差。

image.png

1案训、將其調(diào)整為100%會運(yùn)行就不會報(bào)錯(cuò)了买置。但是100%看著不舒服所以我用了第二種方法。
2强霎、將裁剪的坐標(biāo)全部乘以縮放的比例忿项,即左上角和右下角的x,y軸坐標(biāo)全部乘以1.25.

location = code_png_lel.location
print('location',location)
#獲取驗(yàn)證碼的長寬
size = code_png_lel.size
print('size',size)
#location獲取是根據(jù)百分之百縮放的,而我電腦的縮放是百分之125所以出現(xiàn)偏差
k=1.25
#圖片左上角和右下角的xy坐標(biāo)
rangle = (
    int(location['x'])*k, int(location['y'])*k, int(location['x']+size['width'])*k, int(location['y']+size['height'])*k
)
print('rangle',rangle)
#對全局頁面進(jìn)行截圖獲取局部驗(yàn)證碼
i = Image.open('./aa.png')
#按照給定xy坐標(biāo)裁剪
frame = i.crop(rangle)

下面是我利用該方法獲取12306的驗(yàn)證碼:

from selenium import webdriver
from lxml import etree
from PIL import Image
from time import sleep

#給定Chrome瀏覽器的位置和進(jìn)行偽裝
option = webdriver.ChromeOptions()
option.binary_location = 'E:\\Google Chrome瀏覽器\\Google\\Chrome\\Application\\chrome.exe'
option.add_experimental_option('excludeSwitches',['enable-automation'])

#生成瀏覽器對象
bro = webdriver.Chrome(executable_path=r'E:\chrome瀏覽器驅(qū)動程序\chromedriver_win32\chromedriver',options=option)
#設(shè)置瀏覽器全屏
bro.maximize_window()

bro.get('https://kyfw.12306.cn/otn/resources/login.html')
sleep(1)

#定位到賬號密碼的位置
a_tag = bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
#點(diǎn)擊賬號密碼登錄
a_tag.click()
sleep(2)

#利用save_screenshot()將當(dāng)前頁面解析截圖并保留
bro.save_screenshot('aa.png')
#定位到驗(yàn)證碼的標(biāo)簽所在
sleep(0.4)
code_png_lel = bro.find_element_by_id('J-loginImg')
#獲取驗(yàn)證碼的左上角坐標(biāo)x,y
sleep(0.4)
location = code_png_lel.location
print('location',location)
#獲取驗(yàn)證碼的長寬
size = code_png_lel.size
print('size',size)
#location獲取是根據(jù)百分之百縮放的城舞,而我電腦的縮放是百分之125所以出現(xiàn)偏差
k=1.25
#圖片左上角和右下角的xy坐標(biāo)
rangle = (
    int(location['x'])*k, int(location['y'])*k, int(location['x']+size['width'])*k, int(location['y']+size['height'])*k
)
print('rangle',rangle)
#對全局頁面進(jìn)行截圖獲取局部驗(yàn)證碼
i = Image.open('./aa.png')
#按照給定xy坐標(biāo)裁剪
frame = i.crop(rangle)
frame.save('./code.png')

設(shè)置睡眠時(shí)間是因?yàn)榕戮W(wǎng)站還沒將驗(yàn)證碼顯示出來便截圖了轩触。

參考文章:https://www.cnblogs.com/ddd98dy/p/13586055.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椿争,隨后出現(xiàn)的幾起案子怕膛,更是在濱河造成了極大的恐慌,老刑警劉巖秦踪,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件褐捻,死亡現(xiàn)場離奇詭異,居然都是意外死亡椅邓,警方通過查閱死者的電腦和手機(jī)柠逞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來景馁,“玉大人板壮,你說我怎么就攤上這事『献。” “怎么了绰精?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵撒璧,是天一觀的道長。 經(jīng)常有香客問我笨使,道長卿樱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任硫椰,我火速辦了婚禮繁调,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靶草。我一直安慰自己蹄胰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布奕翔。 她就那樣靜靜地躺著裕寨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪糠悯。 梳的紋絲不亂的頭發(fā)上帮坚,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機(jī)與錄音互艾,去河邊找鬼试和。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纫普,可吹牛的內(nèi)容都是我干的阅悍。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昨稼,長吁一口氣:“原來是場噩夢啊……” “哼节视!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起假栓,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤寻行,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后匾荆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拌蜘,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年牙丽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了简卧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烤芦,死狀恐怖举娩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤铜涉,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布智玻,位于F島的核電站,受9級特大地震影響骄噪,放射性物質(zhì)發(fā)生泄漏尚困。R本人自食惡果不足惜蠢箩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一链蕊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谬泌,春花似錦滔韵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贱鼻,卻和暖如春宴卖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邻悬。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工症昏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人父丰。 一個(gè)月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓肝谭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛾扇。 傳聞我的和親對象是個(gè)殘疾皇子攘烛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評論 2 345