驗證碼往往是爬蟲路上的一只攔路虎,而其花樣也是層出不窮:圖片驗證、滑塊驗證、交互式驗證、行為驗證等。隨著OCR技術(shù)的成熟,圖片驗證已經(jīng)漸漸淡出主流,而滑塊驗證越來越多地出現(xiàn)在大眾視野。
“這么厲害,這小子長啥樣呢?”沒錯,它就長這損sai:
解決它的方法也很直觀,首先找到缺口的位置(通常只需要X軸的位置),然后拖動滑塊即可。
今天kimol君將帶領(lǐng)大家用python識別出滑塊驗證中的缺口位置。
一、缺口識別
識別圖片中的缺口,主要是利用python中的圖像處理庫cv2,其安裝方法如下:
pip install opencv-python
注:這里并不是“pip install cv2”哦~
1.讀取圖片
滑塊驗證的圖片分為兩部分,一個是背景圖片:
另一個是缺口圖片:
利用imread函數(shù)將其讀取:
# 讀取背景圖片和缺口圖片
bg_img = cv2.imread('bg.jpg') # 背景圖片
tp_img = cv2.imread('tp.png') # 缺口圖片
2.識別圖片邊緣
為了更好地將缺口與背景匹配,我們首先得識別出圖片的邊緣:
# 識別圖片邊緣
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
這一步很關(guān)鍵!否則缺口匹配將不準確。
這里得到了圖片邊緣的灰度圖,進一步將其圖片格式轉(zhuǎn)為RGB格式:
# 轉(zhuǎn)換圖片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
轉(zhuǎn)換后的背景圖為:
轉(zhuǎn)換后的缺口圖為:
3.缺口匹配
利用cv2中的matchTemplate函數(shù),可以在背景圖片中搜索對應(yīng)的缺口,具體代碼如下:
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
res為每個位置的匹配結(jié)果,代表了匹配的概率,選出其中概率最高的點,即為缺口匹配的位置:
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最優(yōu)匹配
min_val,max_val,min_loc,max_loc分別為匹配的最小值、匹配的最大值、最小值的位置、最大值的位置。
ps.當(dāng)然,這里完全可以自己寫一個循環(huán)來實現(xiàn),但是有現(xiàn)成的函數(shù)為什么不用呢?
至此,我們已經(jīng)有了缺口的位置,其X軸坐標為:
為了更直觀地展示缺口的位置,我們將缺口用矩形框標注出來:
# 繪制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角點的坐標
br = (tl[0]+tw,tl[1]+th) # 右下角點的坐標
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪制矩形
cv2.imwrite('out.jpg', bg_img) # 保存在本地
結(jié)果如下:
完美~ 收工?。?!
二、完整代碼
為了在實際應(yīng)用中更方便的使用,我們將代碼封裝為一個函數(shù):
def identify_gap(bg,tp,out):
'''
bg: 背景圖片
tp: 缺口圖片
out:輸出圖片
'''
# 讀取背景圖片和缺口圖片
bg_img = cv2.imread(bg) # 背景圖片
tp_img = cv2.imread(tp) # 缺口圖片
# 識別圖片邊緣
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 轉(zhuǎn)換圖片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最優(yōu)匹配
# 繪制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角點的坐標
br = (tl[0]+tw,tl[1]+th) # 右下角點的坐標
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪制矩形
cv2.imwrite(out, bg_img) # 保存在本地
# 返回缺口的X坐標
return tl[0]
這里選擇了讀取本地圖片文件,在爬蟲過程中其實不是特別方便。如果有感興趣的小伙伴,可以自己改動一下,將輸入改為圖片流即可。
以上就是如何用python識別滑塊中的缺口的詳細內(nèi)容,更多關(guān)于python識別滑塊中的缺口的資料請關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- python 模擬網(wǎng)站登錄——滑塊驗證碼的識別
- Python Selenium破解滑塊驗證碼最新版(GEETEST95%以上通過率)
- Python破解BiliBili滑塊驗證碼的思路詳解(完美避開人機識別)
- Python模擬登錄之滑塊驗證碼的破解(實例代碼)
- python滑塊驗證碼的破解實現(xiàn)
- python3 破解 geetest(極驗)的滑塊驗證碼功能
- python繞過圖片滑動驗證碼實現(xiàn)爬取PTA所有題目功能 附源碼
- Python3爬蟲關(guān)于識別檢驗滑動驗證碼的實例
- 基于python實現(xiàn)破解滑動驗證碼過程解析
- python破解bilibili滑動驗證碼登錄功能
- python實現(xiàn)騰訊滑塊驗證碼識別