国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

驗(yàn)證碼識(shí)別

willin / 1519人閱讀

摘要:下面我們便來講種驗(yàn)證碼的識(shí)別方式和一些思路。哈哈庫其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,中有很對圖像處理的庫,其中就是其中之一。所以在處理驗(yàn)證碼識(shí)別之前,必須先了解庫和。第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。

寫在前面

現(xiàn)在,很多網(wǎng)站采取各種各樣的措施來反爬蟲,其中之一就是使用驗(yàn)證碼。當(dāng)我們訪問網(wǎng)頁時(shí),必須先通過驗(yàn)證碼才能夠訪問頁面。下面我們便來講2種驗(yàn)證碼的識(shí)別方式和一些思路。當(dāng)然我們也可以直接使用付費(fèi)的打碼平臺(tái),那樣可以增加識(shí)別的準(zhǔn)確度,畢竟出了錢的嘛。哈哈!

PIL庫

其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,python中有很對圖像處理的庫,其中PIL就是其中之一。 所以在處理驗(yàn)證碼識(shí)別之前,必須先了解PIL庫和tesserocr。 下面附上其API源碼地址,以及對應(yīng)的學(xué)習(xí)博客。
源碼地址:https://pillow-cn.readthedocs.io/zh_CN/latest/reference/index.html
參考博客:https://blog.csdn.net/louishao/article/details/69879981
下面我們就開始驗(yàn)證碼識(shí)別之路了。

圖形驗(yàn)證碼

以中國知網(wǎng)為例:

首先,我們先拿到上圖中綠線標(biāo)記的驗(yàn)證碼,下載到本地項(xiàng)目文件中,
然后,編寫如下代碼:

import tesserocr
from PIL import Image

image = Image.open("image.png")
res = tesserocr.image_to_text(image)
print(res)  # F8BS

輸出結(jié)果為:F8BS, 可是實(shí)際圖片為F8B8,這是因?yàn)轵?yàn)證碼內(nèi)多余線條干擾了圖片的識(shí)別,像這類情況,還需要做出額外的處理,比如轉(zhuǎn)灰度,二值化等。當(dāng)然,實(shí)際處理中并不是這樣,一般我們會(huì)先對模糊圖片進(jìn)行灰度處理后,再設(shè)定二值化的閾值,實(shí)際處理如下:

import tesserocr
from PIL import Image

image = Image.open("code.jpg")  # 創(chuàng)建image對象

image = image.convert("L")
threshold = 150  # 指定二值化閾值
table = []
for i in range(256):
    if i < threshold:
        table.append(0)
    else:
        table.append(1)

image = image.point(table, "1")
image.show()
res = tesserocr.image_to_text(image)
print(res) 

輸出結(jié)果:F8B8
進(jìn)行識(shí)別時(shí),先設(shè)定好二值化閾值threshold,進(jìn)行適當(dāng)調(diào)試,直到圖片能正常識(shí)別為止。

滑動(dòng)驗(yàn)證碼

過程分析:

滑動(dòng)驗(yàn)證碼主要的驗(yàn)證方式是拖動(dòng)滑塊,拼合圖像;如圖象完全拼合,則驗(yàn)證成功,即表單提交成功,否則需要重新驗(yàn)證。
如圖:

下面,我們就以極驗(yàn)的驗(yàn)證碼為例,來講訴一下識(shí)別方法。
因?yàn)闃O驗(yàn)的驗(yàn)證碼在拖動(dòng)驗(yàn)證碼后會(huì)生成一個(gè)加密的表單提交到后臺(tái),所有為了避免麻煩我們直接用selenium模擬瀏覽器行為來完成驗(yàn)證。
登陸網(wǎng)站:極驗(yàn)官網(wǎng)

目標(biāo)站點(diǎn):https://account.geetest.com/l...

首先,我們發(fā)現(xiàn)登陸界面有個(gè)智能按鈕,一般來說,在輸入郵箱之后,點(diǎn)擊按鈕就會(huì)彈出滑動(dòng)驗(yàn)證窗口,然后我們在拖動(dòng)驗(yàn)證碼完成圖像拼接,完成驗(yàn)證。

所以,滑塊驗(yàn)證識(shí)別需要完成以下步驟:

模擬點(diǎn)擊驗(yàn)證按鈕

識(shí)別滑塊的缺口位置

模擬拖動(dòng)滑塊

如何實(shí)現(xiàn)以上步驟呢?我們先需要將任務(wù)進(jìn)行分解,看似只有三大步驟,其實(shí)里面坑還有很多的,稍后會(huì)做解釋。

第一步,輸入賬號(hào),獲取智能按鈕,使用selenium模擬點(diǎn)擊,獲取帶有缺口的圖片。

第二步,獲取上面缺口圖片中的完整圖片。這里有個(gè)地方要注意,正常情況下我們在網(wǎng)頁源代碼里是找不到完整圖的,因?yàn)樗浑[藏了,必須執(zhí)行javascript語句才能出現(xiàn)完整圖。

我們將display參數(shù)改為block,opacity參數(shù)改為1,然后進(jìn)行截圖,就可以拿到完整的驗(yàn)證碼圖片了。

第三步,對比兩張圖片的所有RGB像素點(diǎn),得到缺口位置。

第四步,模擬人的拖動(dòng)習(xí)慣,這里也有坑,極驗(yàn)的驗(yàn)證碼增加了機(jī)器軌跡識(shí)別,勻速移動(dòng),或者隨機(jī)速度移動(dòng)滑塊都不能通過驗(yàn)證,所以我們將需要拖動(dòng)的總位移分成一段一段小的軌跡,先勻加速拖動(dòng)后勻減速拖動(dòng)。

第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。

第六步,完成賬號(hào)登陸。

過程分析完了,下面我們就來寫代碼試一下:
首先,我們先將整個(gè)代碼的一個(gè)邏輯思路做一個(gè)大致的概括吧。

def main():
    """主函數(shù)"""

    # 獲取帶缺口驗(yàn)證碼圖片image1, 傳入的參數(shù)后綴為: .png
    image1 = get_unFull_captcha("unfull_captcha.png")
    # print(image1.load()[12,25])
    # 獲取完整驗(yàn)證碼圖片image2
    image2 = get_full_captcha("full_captcha.png")
    # 對比上述圖片像素點(diǎn),獲取缺口位置,得到偏移距離
    distance = get_quekou_distance(image1, image2)
    print("缺口偏移量:", distance)
    # 獲取滑塊的移動(dòng)軌跡
    track = get_track(distance)
    # 模擬人的行為,拖動(dòng)滑塊,完成驗(yàn)證
    slider = get_slider()
    move(slider, track)
    success = wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, "geetest_success_radar_tip_content"), "驗(yàn)證成功"))
    print(success)
    if success:
        login()
    else:
        main()

接下來,我們便來逐一完成main函數(shù)里要實(shí)現(xiàn)的功能了。

代碼示例:
通過以上代碼我們便拿到了完整的驗(yàn)證碼和帶有缺口的驗(yàn)證碼。
缺口圖片:

def get_unFull_captcha(name):
    """
    獲取帶缺口驗(yàn)證碼圖片
    :return: unfull captcha
    """
    top, bottom, left, right = get_captcha_position("geetest_canvas_slice")
    print("驗(yàn)證碼1位置:", top, bottom, left, right)
    screenshot = get_screenshot()
    unfull_captcha = screenshot.crop((left, top, right, bottom)) # 按圖片位置裁剪
    unfull_captcha.save(name)     # 這里傳入的name要以xxx.png命名
    return unfull_captcha

完整圖片:

def get_full_captcha(name):
    """
    獲取完整驗(yàn)證碼圖片
    :return: full_captcha
    """
    # 這里要執(zhí)行JavaScript腳本才能拿到完整圖片的截圖
    show_Full_img1= "document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block""
    browser.execute_script(show_Full_img1)
    show_Full_img2 = "document.getElementsByClassName("geetest_canvas_fullbg")[0].style.opacity=1"
    browser.execute_script(show_Full_img2)
    # 等待完整圖片加載
    time.sleep(2)
    top, bottom, left, right = get_captcha_position("geetest_canvas_fullbg")
    print("驗(yàn)證碼2位置:", top, bottom, left, right)
    screenshot = get_screenshot()
    full_captcha = screenshot.crop((left, top, right, bottom))  # 同上
    full_captcha.save(name)
    return full_captcha

這里我在調(diào)試的時(shí)候碰到一個(gè)坑,因?yàn)閏hrome中,location方法不滾動(dòng),直接返回相對整個(gè)html的坐標(biāo),我的電腦是15.6寸的,顯示設(shè)置上布局的縮放大小被放大到1.25倍,導(dǎo)致location返回的坐標(biāo)與驗(yàn)證碼的坐標(biāo)有誤差。修改布局為100%后就解決了。 下面便是對比圖片找出缺口位置。這里我們需要遍歷圖片的坐標(biāo)點(diǎn),獲取像素點(diǎn)的RGB數(shù)據(jù)。

代碼示例

def get_quekou_distance(image1, image2):
    """
    對比像素點(diǎn),獲取缺口位置
    :param image1: 缺口圖片
    :param image2: 完整圖片
    :return: 缺口的偏移距離
    """
    # 缺口在滑塊右側(cè),設(shè)定遍歷初始橫坐標(biāo)left為59
    left = 60
    # 像素對比閾值
    threshold = 60

    for i in range(left, image2.size[0]):
        for j in range(image2.size[1]):
            rgb1 = image1.load()[i, j]
            rgb2 = image2.load()[i, j]

            res1 = abs(rgb2[0] - rgb1[0])
            res2 = abs(rgb2[1] - rgb1[1])
            res3 = abs(rgb2[2] - rgb1[2])
            if not (res1 < threshold and res2 < threshold and res3 < threshold):
                return i-7 # 返回缺口偏移距離,這里需測試幾次

接下來就是獲取滑塊的移動(dòng)路徑和模擬拖動(dòng)行為了。

執(zhí)行代碼:

def get_track(distance):
    """
    獲取移動(dòng)路徑
    :param distance: 偏移量
    :return: track:移動(dòng)軌跡
    """
    # 存放移動(dòng)軌跡
    track = []
    # 當(dāng)前位置
    current = 0
    # 設(shè)定加速段和減速段臨界點(diǎn)為路徑的3/4處
    mid = distance*4/5
    # 時(shí)間間隔time, 取0.2~0.3之間隨機(jī)數(shù),避免被網(wǎng)站識(shí)別出來
    t = random.randint(2, 3)/10
    # 初速度
    v = 0

    while current < distance:
        if current < mid:
            # 勻加速移動(dòng),加速度a
            a = 2
        else:
            a = -3
        # 初速度
        v0 = v
        # 當(dāng)前速度
        v = v0 + a*t
        # 移動(dòng)距離
        s = v0*t + 1/2 * a * t*t
        # 當(dāng)前位移
        current += s
        # 加入到移動(dòng)軌跡
        track.append(round(s))
    return track

def move(slider, track):
    """
    模擬鼠標(biāo)操作,點(diǎn)擊,移動(dòng)滑塊按鈕
    :param: 滑塊
    :param: 軌跡
    :return:
    """
    ActionChains(browser).click_and_hold(slider).perform()
    # 操作鼠標(biāo)按軌跡移動(dòng)
    for x in track:
        ActionChains(browser).move_by_offset(xoffset=x, yoffset=0).perform()
    time.sleep(0.3)
    # 松開
    ActionChains(browser).release().perform()

最后終于成功了,踩了這么多坑,終于完成了滑塊驗(yàn)證碼的破解。。。現(xiàn)在已經(jīng)實(shí)現(xiàn)功能,因?yàn)檫€可能出現(xiàn)其他情況,接下來我們還需要完善一下代碼,其實(shí)也可封裝成一個(gè)類,測試的時(shí)候我們會(huì)發(fā)現(xiàn),圖片會(huì)彈出小怪獸被吃了,那是因?yàn)橄到y(tǒng)識(shí)別我們是機(jī)器行為,所以不通過,這里我們需要修改加速度參數(shù),再增加一個(gè)回調(diào)。

這樣我們就成功破解驗(yàn)證碼,并登陸到網(wǎng)頁界面了。。。忙活了一上午,吃飯去了。
好像現(xiàn)在極驗(yàn)官網(wǎng)改了, 但是滑動(dòng)驗(yàn)證碼思路基本上就是這樣的...

源碼地址:https://github.com/appleguardu/spider_projects/tree/master/Captcha

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/103198.html

相關(guān)文章

  • windows下簡單驗(yàn)證識(shí)別——完美驗(yàn)證識(shí)別系統(tǒng)

    摘要:可惜收費(fèi)的,今天要介紹的完美驗(yàn)證碼識(shí)別系統(tǒng)是類似的免費(fèi)產(chǎn)品。調(diào)用函數(shù)相當(dāng)簡單的,對比復(fù)雜的參數(shù),這個(gè)識(shí)別是相當(dāng)?shù)目旖荨? 此文已由作者徐迪授權(quán)網(wǎng)易云社區(qū)發(fā)布。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 講到驗(yàn)證碼識(shí)別,大家第一個(gè)可能想到tesseract。誠然,對于OCR而言,tesseract確實(shí)很強(qiáng)大,自帶的字模能識(shí)別絕大多數(shù)規(guī)整的中英文。但是驗(yàn)證碼畢竟不是OCR。對于現(xiàn)在...

    shleyZ 評論0 收藏0
  • 如何識(shí)別圖片驗(yàn)證?

    摘要:圖片驗(yàn)證碼是目前最常用的一種。神經(jīng)網(wǎng)絡(luò)以上驗(yàn)證碼識(shí)別都依賴于字符切分,切分的好壞幾乎直接決定識(shí)別的準(zhǔn)確程度。目前驗(yàn)證碼識(shí)別最先進(jìn)的是谷歌在識(shí)別街景圖像中門牌號(hào)碼中使用的一套的算法。 全自動(dòng)區(qū)分計(jì)算機(jī)和人類的圖靈測試(Completely Automated Public Turing test to tell Computers and Humans Apart,簡稱CAPTCHA),...

    y1chuan 評論0 收藏0
  • node識(shí)別驗(yàn)證

    摘要:驗(yàn)證碼的識(shí)別成功率跟圖片質(zhì)量關(guān)系密切,一般拿到后的驗(yàn)證碼都得經(jīng)過灰度化,二值化,去噪,利用就可以很方便的做到。 了解驗(yàn)證碼 什么是驗(yàn)證碼? 所謂驗(yàn)證碼,就是將一串隨機(jī)產(chǎn)生的數(shù)字或符號(hào),生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識(shí)別其中的驗(yàn)證碼信息,輸入表單提交網(wǎng)站驗(yàn)證,驗(yàn)證成功后才能使用某項(xiàng)功能,通俗說就是一種區(qū)分用戶是計(jì)算機(jī)和人的公共全自動(dòng)程序 驗(yàn)證碼的作用 可以...

    levy9527 評論0 收藏0
  • 為什么很多網(wǎng)站的驗(yàn)證都設(shè)置得肉眼都很難識(shí)別?

    摘要:為了應(yīng)付這種情況,很多網(wǎng)站加大驗(yàn)證碼識(shí)別難度,復(fù)雜的驗(yàn)證碼甚至讓用戶都很難識(shí)別了,這種方式劣勢十分明顯,糟糕的用戶體驗(yàn)最終會(huì)讓網(wǎng)站流失用戶,這便是為什么有人吐槽網(wǎng)站的驗(yàn)證碼的原因了。 歡迎訪問網(wǎng)易云社區(qū),了解更多網(wǎng)易技術(shù)產(chǎn)品運(yùn)營經(jīng)驗(yàn)。 首先來談?wù)勻?yàn)證碼的機(jī)制,驗(yàn)證碼作為一種人機(jī)識(shí)別手段,其終極目的,就是區(qū)分正常人和機(jī)器的操作。而對于沒有驗(yàn)證碼的場景,比如用戶登陸,則機(jī)器可以同時(shí)、大批量...

    lauren_liuling 評論0 收藏0
  • 驗(yàn)證識(shí)別

    摘要:下面我們便來講種驗(yàn)證碼的識(shí)別方式和一些思路。哈哈庫其實(shí),驗(yàn)證碼識(shí)別歸根到底還是對各種各樣圖片的識(shí)別和操作,中有很對圖像處理的庫,其中就是其中之一。所以在處理驗(yàn)證碼識(shí)別之前,必須先了解庫和。第五步,按照規(guī)定軌跡進(jìn)行拖動(dòng),完成驗(yàn)證。 寫在前面 現(xiàn)在,很多網(wǎng)站采取各種各樣的措施來反爬蟲,其中之一就是使用驗(yàn)證碼。當(dāng)我們訪問網(wǎng)頁時(shí),必須先通過驗(yàn)證碼才能夠訪問頁面。下面我們便來講2種驗(yàn)證碼的識(shí)別方...

    keke 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<