最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python自動化操作之動態(tài)驗證碼、滑動驗證碼的降噪和識別

 更新時間:2021年08月29日 09:38:24   作者:autofelix  
很多網(wǎng)站登錄都需要輸入驗證碼,如果要實現(xiàn)自動登錄就不可避免的要識別驗證碼,下面這篇文章主要給大家介紹了關于python自動化操作之動態(tài)驗證碼、滑動驗證碼的降噪和識別,需要的朋友可以參考下

前言

python對動態(tài)驗證碼、滑動驗證碼的降噪和識別,在各種自動化操作中,我們經(jīng)常要遇到沿跳過驗證碼的操作,而對于驗證碼的降噪和識別,的確困然了很多的人。這里我們就詳細講解一下不同驗證碼的降噪和識別。

一、動態(tài)驗證碼 

  • 動態(tài)驗證碼是服務端生成的,點擊一次,就會更換一次,這就會造成很多人在識別的時候,會發(fā)現(xiàn)驗證碼一直過期
  • 這是因為,如果你是把圖片下載下來,進行識別的話,其實在下載的這個請求中,其實相當于點擊了一次,這個驗證碼的內(nèi)容已經(jīng)被更換了
  • 最好的方法是,打開這個頁面后,將頁面進行截圖,然后定位到驗證碼的位置,將驗證碼從截圖上面裁剪下來進行識別,這樣就不會造成多次請求,驗證碼更換的情況了

from selenium import webdriver
from PIL import Image
 
# 實例化瀏覽器
driver = webdriver.Chrome()
 
# 最大化窗口
driver.maximize_window()
 
# 打開登陸頁面
driver.get(# 你的url地址)
 
# 保存頁面截圖
driver.get_screenshot_as_file('./screen.png')
 
# 定位驗證碼的位置
location = driver.find_element_by_id('login_yzm_img').location
size = driver.find_element_by_id('login_yzm_img').size
left = location['x']
top =  location['y']
right = location['x'] + size['width']
bottom = location['y'] + size['height']
 
# 裁剪保存
img = Image.open('./screen.png').crop((left,top,right,bottom))
img.save('./code.png')
 
driver.quit()

二、滑動驗證碼

  • 滑動驗證碼,通常是兩個滑塊圖片,將小圖片滑動到大圖片上的缺口位置,進行重合,即可通過驗證
  • 對于滑動驗證碼,我們就要識別大圖上面的缺口位置,然后讓小滑塊滑動響應的位置距離,即可
  • 而為了讓你滑動起來,更加的擬人化,你需要一個滑動的路徑,模擬人為去滑動,而不是機器去滑動

# 下載兩個滑塊
bg = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[1]').get_attribute('src')
slider = self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[2]/img[2]').get_attribute('src')
 
request.urlretrieve(bg, os.getcwd() + '/bg.png')
request.urlretrieve(slider, os.getcwd() + '/slider.png')
 
 
# 獲取兩個滑塊偏移量方法
def getGap(self, sliderImage, bgImage):
    '''
    Get the gap distance
    :param sliderImage: the image of slider
    :param bgImage: the image of background
    :return: int
    '''
    bgImageInfo = cv2.imread(bgImage, 0)
    bgWidth, bgHeight = bgImageInfo.shape[::-1]
    bgRgb = cv2.imread(bgImage)
    bgGray = cv2.cvtColor(bgRgb, cv2.COLOR_BGR2GRAY)
 
    slider = cv2.imread(sliderImage, 0)
    sliderWidth, sliderHeight = slider.shape[::-1]
 
    res = cv2.matchTemplate(bgGray, slider, cv2.TM_CCOEFF)
    a, b, c, d = cv2.minMaxLoc(res)
    # print(a,b,c,d)
    # 正常如下即可
    # return c[0] if abs(a) >= abs(b) else d[0]
    # 但是頭條顯示驗證碼的框跟驗證碼本身的像素不一致,所以需要根據(jù)比例計算
    if abs(a) >= abs(b):
        return c[0] * bgWidth / (bgWidth - sliderWidth)
    else:
        return d[0] * bgWidth / (bgWidth - sliderWidth)
 
# 移動路徑方法
def getTrack(self, distance):
    '''
    Get the track by the distance
    :param distance: the distance of gap
    :return: list
    '''
    # 移動軌跡
    track = []
    # 當前位移
    current = 0
    # 減速閾值
    mid = distance * 4 / 5
    # 計算間隔
    t = 0.2
    # 初速度
    v = 0
 
    while current < distance:
        if current < mid:
            # 加速度為正2
            a = 2
        else:
            # 加速度為負3
            a = -3
        # 初速度v0
        v0 = v
        # 當前速度v = v0 + at
        v = v0 + a * t
        # 移動距離x = v0t + 1/2 * a * t^2
        move = v0 * t + 1 / 2 * a * t * t
        # 當前位移
        current += move
        # 加入軌跡
        track.append(round(move))
    return track
 
 
# 滑動到缺口位置
def moveToGap(self, track):
    '''
    Drag the mouse to gap
    :param track: the track of mouse
    :return: None
    '''
    ActionChains(self.driver).click_and_hold(self.driver.find_element_by_xpath('//*[@id="captcha_container"]/div/div[3]/div[2]/div[2]/div')).perform()
    while track:
        x = random.choice(track)
        ActionChains(self.driver).move_by_offset(xoffset=x, yoffset=0).perform()
        track.remove(x)
    time.sleep(0.5)
    ActionChains(self.driver).release().perform()

三、驗證碼的降噪

驗證碼的降噪,只是為了處理驗證碼圖像上的多余的線條和干擾線,讓你后期識別更加的準確,提高識別的準確度

第一步:可以進行灰度轉化

img = cv2.imread('yzm.png')
# 將圖片灰度化處理,降維,加權進行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('min_gray',gray)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

第二步: 二值化處理

import cv2
 
img = cv2.imread('yzm.png')
# 將圖片灰度化處理,降維,加權進行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
 
cv2.imshow('threshold',gray2)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

第三步:噪點過濾

import cv2
 
img = cv2.imread('yzm.png')
# 將圖片灰度化處理,降維,加權進行灰度化c
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
 
t,gray2 = cv2.threshold(gray,220,255,cv2.THRESH_BINARY)
 
def remove_noise(img, k=4):
    img2 = img.copy()
 
    #     img處理數(shù)據(jù),k過濾條件
    w, h = img2.shape
 
    def get_neighbors(img3, r, c):
        count = 0
        for i in [r - 1, r, r + 1]:
            for j in [c - 1, c, c + 1]:
                if img3[i, j] > 10:  # 純白色
                    count += 1
        return count
 
    #     兩層for循環(huán)判斷所有的點
    for x in range(w):
        for y in range(h):
            if x == 0 or y == 0 or x == w - 1 or y == h - 1:
                img2[x, y] = 255
            else:
                n = get_neighbors(img2, x, y)  # 獲取鄰居數(shù)量,純白色的鄰居
                if n > k:
                    img2[x, y] = 255
    return img2
 
 
result = remove_noise(gray2)
cv2.imshow('8neighbors', result)
 
cv2.waitKey(0)
cv2.destroyAllWindows()

四、驗證碼的識別

通常我們會使用tesserocr識別驗證碼,但是這個庫有很大的局限性,識別率低,即時降噪效果很好,有很少的線條,也會不準確,這種識別方式并不十分推薦

所以我們一般會使用第三方的接口進行識別,比如阿里的圖片識別、騰訊也都是有的

這些第三方接口需要自己接入識別接口

#識別降噪后的圖片
code = tesserocr.image_to_text(nrImg)
 
#消除空白字符
code.strip()
 
#打印
print(code)

總結

到此這篇關于python自動化操作之動態(tài)驗證碼、滑動驗證碼的降噪和識別的文章就介紹到這了,更多相關python動態(tài)驗證碼降噪和識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python數(shù)據(jù)可視化正態(tài)分布簡單分析及實現(xiàn)代碼

    Python數(shù)據(jù)可視化正態(tài)分布簡單分析及實現(xiàn)代碼

    這篇文章主要介紹了Python數(shù)據(jù)可視化正態(tài)分布簡單分析及實現(xiàn)代碼,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • python實現(xiàn)爬蟲下載美女圖片

    python實現(xiàn)爬蟲下載美女圖片

    本文給大家發(fā)發(fā)福利,給大家分享一個使用Python實現(xiàn)爬蟲下載百度貼吧美女圖片的代碼,十分不錯,有需要的小伙伴直接拿走吧。
    2015-07-07
  • 打包PyQt5應用時的注意事項

    打包PyQt5應用時的注意事項

    這篇文章主要介紹了打包PyQt5應用時的注意事項的相關資料,需要的朋友可以參考下
    2020-02-02
  • 簡單介紹python封裝的基本知識

    簡單介紹python封裝的基本知識

    這篇文章主要介紹了簡單介紹python封裝的基本知識,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 用Python搶過年的火車票附源碼

    用Python搶過年的火車票附源碼

    離過年時間也不久了,還是預訂春節(jié)火車票了,現(xiàn)在有好多平臺都可以幫助大家搶購火車,下面小編給大家介紹用python搶過年的火車票附源碼,對pthon搶火車票相關知識感興趣的朋友一起學習吧
    2015-12-12
  • 利用python畫出折線圖

    利用python畫出折線圖

    這篇文章主要為大家詳細介紹了利用python畫出折線圖的相關代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • 利用Python?requests庫爬取高德地圖全國地鐵站點信息

    利用Python?requests庫爬取高德地圖全國地鐵站點信息

    requests?模塊是?python?基于?urllib,采用?Apache2?Licensed?開源協(xié)議的?HTTP?庫,它比?urllib?更加方便,可以節(jié)約我們大量的工作,完全滿足?HTTP?測試需求,這篇文章主要介紹了利用Python?requests庫爬取高德地圖全國地鐵站點信息,需要的朋友可以參考下
    2024-03-03
  • 控制Python浮點數(shù)輸出位數(shù)的操作方法

    控制Python浮點數(shù)輸出位數(shù)的操作方法

    在python的輸出結果中,尤其是浮點數(shù)的輸出,當我們需要寫入文本文件時,最好是采用統(tǒng)一的輸出格式,這樣也能夠增強結果的可讀性,這篇文章主要介紹了控制Python浮點數(shù)輸出位數(shù)的方法,需要的朋友可以參考下
    2022-04-04
  • 在Python 2.7即將停止支持時,我們?yōu)槟銕砹艘环輕ython 3.x遷移指南

    在Python 2.7即將停止支持時,我們?yōu)槟銕砹艘环輕ython 3.x遷移指南

    這篇文章主要介紹了在Python 2.7即將停止支持時我們?yōu)槟銣蕚淞艘环輕ython 3.x遷移指南的相關資料,需要的朋友可以參考下
    2018-01-01
  • 基于python實現(xiàn)地址和經(jīng)緯度轉換

    基于python實現(xiàn)地址和經(jīng)緯度轉換

    這篇文章主要介紹了基于python實現(xiàn)地址和經(jīng)緯度轉換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05

最新評論

靖州| 临沧市| 稷山县| 旬邑县| 保德县| 抚远县| 庆安县| 桂东县| 新兴县| 临沧市| 开封市| 三门峡市| 巧家县| 山阳县| 株洲县| 鹰潭市| 闽侯县| 湖口县| 宿松县| 平定县| 民丰县| 邵阳市| 固原市| 隆子县| 栾川县| 阜新| 张家界市| 徐汇区| 合江县| 裕民县| 罗田县| 花莲县| 克山县| 嘉峪关市| 任丘市| 介休市| 武平县| 和田县| 云和县| 丹寨县| 赤城县|