爬蟲滑動驗證識別 opencv-python

前言

滑塊驗證碼破解是一直都是一個棘手的問題,畢竟多數(shù)網(wǎng)站都會采用滑塊驗證碼要搞現(xiàn)在的滑塊驗證碼繞不開圖像處理厚满,圖像處理當然是首推OpenCV-Python(開箱即用) 我的速成OpenCV非常菜, 發(fā)現(xiàn)問題就直接指出嘛屑埋,不用走流程啦!

環(huán)境
pip install opencv-python

OpenCV的使用
相關(guān)的API我也是邊用邊查的痰滋,用得也是相當生疏!具體的常用方法大家只好自行百度

實現(xiàn)原理及方法

騰訊滑塊驗證
這次搞得目標就是騰訊滑塊驗證碼续崖,調(diào)用騰訊滑塊這個接口的網(wǎng)站還是挺多的敲街,比如非常好用的在線畫圖網(wǎng)站ProcessOn,其中滑塊驗證部分類似這樣子的:

image.png

破解滑塊驗證碼最為關(guān)鍵的地方在于找到滑塊缺口的位置严望,找到缺口位置后就可以利用Selenium模擬拖動滑塊到指定位置實現(xiàn)破解多艇,之前的老辦法就是將完整圖的像素點和帶缺口圖的像素點進行比較從而得到缺口位置,但是現(xiàn)在一般不會將完整圖暴露給我們像吻,所以只有在帶有缺口的圖上進行處理峻黍。我這里一共有兩種方案進行缺口位置識別,一種是基于模板匹配的拨匆,另一種是基于輪廓檢測的姆涩,下面會細講兩種方案的實現(xiàn)方法。

模板匹配識別缺口
具體是實現(xiàn)過程如下:
1.處理滑塊的圖片

  • 灰度化滑塊圖片
  • 處理一下滑塊圖中滑塊的外圈
  • 使用inRange二值化滑塊圖
  • 使用開運算去除白色噪點

運行結(jié)果如下所示(左側(cè)為原始滑塊惭每,右側(cè)為處理后的滑塊):


image.png

2.處理帶缺口的圖片

  • 先來個高斯濾波去噪
  • 灰度化帶缺口圖
  • 使用閾值二值化該圖

運行結(jié)果如下所示(左側(cè)為原始圖骨饿,右側(cè)為處理后的圖):


image.png

3.進行模板匹配
調(diào)用模板匹配API并圈出匹配上的區(qū)域,結(jié)果如下所示:

image.png

警告警告警告
這種方法的缺口識別率在50%左右,很大一部分原因是滑塊圖的背景為純白色宏赘,這在匹配時會產(chǎn)生很大的干擾绒北,要是能將滑塊圖的背景變?yōu)橥该?/code>,正確的匹配率可以達到90%以上

如果大家有任何將滑塊圖的背景變?yōu)橥该鞯霓k法察署,可以留言到評論區(qū)闷游,我真的萬分感謝!L簟脐往!下面是現(xiàn)階段的實現(xiàn)代碼:

# encoding:utf-8
import cv2 as cv
import numpy as np

# 對滑塊進行二值化處理
def handle_img1(image):
    kernel = np.ones((8, 8), np.uint8)  # 去滑塊的前景噪聲內(nèi)核
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    width, heigth = gray.shape
    for h in range(heigth):
        for w in range(width):
            if gray[w, h] == 0:
                gray[w, h] = 96
    # cv.imshow('gray', gray)
    binary = cv.inRange(gray, 96, 96)
    res = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel)  # 開運算去除白色噪點
    # cv.imshow('res', res)
    return res

# 模板匹配(用于尋找缺口有點誤差)
def template_match(img_target, img_template):
    tpl = handle_img1(img_template)  # 誤差來源就在于滑塊的背景圖為白色
    blurred = cv.GaussianBlur(img_target, (3, 3), 0)  # 目標圖高斯濾波
    gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
    ret, target = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)  # 目標圖二值化
    # cv.imshow("template", tpl)
    # cv.imshow("target", target)
    method = cv.TM_CCOEFF_NORMED
    width, height = tpl.shape[:2]
    result = cv.matchTemplate(target, tpl, method)
    min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
    left_up = max_loc
    right_down = (left_up[0] + height, left_up[1] + width)
    cv.rectangle(img_target, left_up, right_down, (0, 0, 255), 2)
    cv.imshow('res', img_target)

if __name__ == '__main__':
    img0 = cv.imread('./demo/3/hycdn_3.jpg')
    img1 = cv.imread('./demo/3/hycdn_3_2.png')
    template_match(img0, img1)
    cv.waitKey(0)
    cv.destroyAllWindows()

輪廓檢測識別缺口
基于輪廓檢測缺口的思路簡單很多,加上合理的條件識別率在95%以上嘶是,實現(xiàn)過程如下:

  • 帶缺口圖高斯模糊去噪
  • (200,400)的閾值做Canny邊緣檢測
  • 尋找輪廓
  • 對已有的輪廓做約束钙勃,比如輪廓的面積范圍,輪廓的周長范圍
    匹配結(jié)果如下:


    image.png

    實現(xiàn)代碼如下:

# encoding:utf-8
import cv2 as cv

def get_pos(image):
    blurred = cv.GaussianBlur(image, (5, 5), 0)
    canny = cv.Canny(blurred, 200, 400)
    contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i, contour in enumerate(contours):
        M = cv.moments(contour)
        if M['m00'] == 0:
            cx = cy = 0
        else:
            cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
        if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:
            if cx < 400:
                continue
            x, y, w, h = cv.boundingRect(contour)  # 外接矩形
            cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
            cv.imshow('image', image)
            return x
    return 0

if __name__ == '__main__':
    img0 = cv.imread('./demo/4/hycdn_4.jpg')
    get_pos(img0)
    cv.waitKey(0)
    cv.destroyAllWindows()

遺留問題

問題1
如何將滑塊圖的純白背景變?yōu)橥该鞅尘埃?br> 進一步降噪的處理方法

問題2
使用Selenium和軌跡算法拖動滑塊時將滑塊拖出左側(cè)的范圍之外聂喇,軌跡算法是先加速后減速整體是向前移動的辖源,按道理來說不可能往回走,但是模擬拖動的時候會出現(xiàn)滑塊向后拖動且拖出范圍的現(xiàn)象希太,這問題如何解決克饶?
問題3

終極問題:
selenium 在某些網(wǎng)站上根本獲取不到彈出的驗證模塊標簽, 查看driver_source確實沒有返回滑動按鈕部分的源碼, 拿不到按鈕就不能進行模擬操作 暫時無解!!!
參考鏈接:https://github.com/Forbilly/captcha_cracking

更新新方法

參考: github_addr

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市誊辉,隨后出現(xiàn)的幾起案子矾湃,更是在濱河造成了極大的恐慌,老刑警劉巖堕澄,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邀跃,死亡現(xiàn)場離奇詭異,居然都是意外死亡蛙紫,警方通過查閱死者的電腦和手機拍屑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坑傅,“玉大人僵驰,你說我怎么就攤上這事⊙涠荆” “怎么了蒜茴?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浆西。 經(jīng)常有香客問我粉私,道長,這世上最難降的妖魔是什么近零? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任毡鉴,我火速辦了婚禮崔泵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猪瞬。我一直安慰自己憎瘸,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布陈瘦。 她就那樣靜靜地躺著幌甘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痊项。 梳的紋絲不亂的頭發(fā)上锅风,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音鞍泉,去河邊找鬼皱埠。 笑死,一個胖子當著我的面吹牛咖驮,可吹牛的內(nèi)容都是我干的边器。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼托修,長吁一口氣:“原來是場噩夢啊……” “哼忘巧!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起睦刃,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤砚嘴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涩拙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體际长,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年兴泥,在試婚紗的時候發(fā)現(xiàn)自己被綠了也颤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡郁轻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出文留,到底是詐尸還是另有隱情好唯,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布燥翅,位于F島的核電站骑篙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏森书。R本人自食惡果不足惜靶端,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一谎势、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杨名,春花似錦脏榆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趁蕊,卻和暖如春坞生,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掷伙。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工是己, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人任柜。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓卒废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親乘盼。 傳聞我的和親對象是個殘疾皇子升熊,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容