亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎功能

 更新時(shí)間:2021年09月13日 16:18:12   作者:eliwang  
本文給大家介紹python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

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

分別獲取驗(yàn)證碼背景圖和滑塊圖兩張照片,然后利用opencv庫(kù),通過(guò)高斯模糊和Canny算法進(jìn)行處理,然后通過(guò)matchTemplate方法進(jìn)行兩張圖的匹配,獲得滑動(dòng)距離。需要注意的是,知乎驗(yàn)證碼在進(jìn)行操作的時(shí)候,需要在原有基礎(chǔ)上再向右偏移10px距離

def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'):
        """獲取滑塊移動(dòng)距離"""

        # 背景圖片處理
        bg_img = cv.imread(bg_img_path, 0)  # 讀入灰度圖片
        bg_img = cv.GaussianBlur(bg_img, (3, 3), 0)  # 高斯模糊去噪
        bg_img = cv.Canny(bg_img, 50, 150)  # Canny算法進(jìn)行邊緣檢測(cè)
        # 滑塊做同樣處理
        slider_img = cv.imread(slider_img_path, 0)
        slider_img = cv.GaussianBlur(slider_img, (3, 3), 0)
        slider_img = cv.Canny(slider_img, 50, 150)
        # 尋找最佳匹配
        res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)
        # 最小值,最大值,并得到最小值, 最大值的索引
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
        # 例如:(-0.05772797390818596, 0.30968162417411804, (0, 0), (196, 1))
        top_left = max_loc[0]  # 橫坐標(biāo)
        return top_left

滑塊運(yùn)動(dòng)軌跡

模擬人的行為,到缺口位置時(shí),繼續(xù)向后滑動(dòng)一段距離,然后再回退到準(zhǔn)確位置

def get_tracks(self, distance):
        '''滑動(dòng)軌跡 '''

        tracks = []
        v = 0
        t = 0.2  # 單位時(shí)間
        current = 0  # 滑塊當(dāng)前位移
        distance += 10  # 多移動(dòng)10px,然后回退
        while current < distance:
            if current < distance * 5 / 8:
                a = random.randint(1, 3)
            else:
                a = -random.randint(2, 4)
            v0 = v  # 初速度
            track = v0 * t + 0.5 * a * (t ** 2)  # 單位時(shí)間(0.2s)的滑動(dòng)距離
            tracks.append(round(track))  # 加入軌跡
            current += round(track)
            v = v0 + a * t
        #回退到大致位置
        for i in range(5):
            tracks.append(-random.randint(1, 3))
        return tracks

鼠標(biāo)滑動(dòng)操作

通過(guò)selenium中的鼠標(biāo)動(dòng)作鏈,按照滑動(dòng)軌跡進(jìn)行滑動(dòng)

def mouse_move(self,slide,tracks):
        '''鼠標(biāo)滑動(dòng)'''

        #鼠標(biāo)點(diǎn)擊滑塊并按照不放
        ActionChains(self.driver).click_and_hold(slide).perform()
        #按照軌跡進(jìn)行滑動(dòng),
        for track in tracks:
            ActionChains(self.driver).move_by_offset(track, 0).perform() 
        ActionChains(self.driver).release(slide).perform()

規(guī)避知乎selenium檢測(cè)

使用selenium自動(dòng)化測(cè)試爬取知乎的時(shí)候出現(xiàn)了:錯(cuò)誤代碼10001:請(qǐng)求異常請(qǐng)升級(jí)客戶端后重新嘗試,這個(gè)錯(cuò)誤的產(chǎn)生是由于知乎可以檢測(cè)selenium自動(dòng)化測(cè)試的腳本

使用chrome的遠(yuǎn)程調(diào)試模式結(jié)合selenium來(lái)遙控操作chrome進(jìn)行抓取,這樣就會(huì)規(guī)避selenium被網(wǎng)站檢測(cè)到

添加環(huán)境變量

將chrome.exe的目錄添加到系統(tǒng)環(huán)境變量,比如C:\Program Files\Google\Chrome\Application,這樣就可以直接在命令行輸入chrome.exe啟動(dòng)瀏覽器

打開cmd窗口,執(zhí)行命令

chrome.exe --remote-debugging-port=9222 --user-data-dir="E:\eliwang\selenium_data"

注意端口不要被占用,user-data-dir用來(lái)指明配置文件的路徑,自定義

此時(shí)會(huì)開啟瀏覽器,并打開一個(gè)新的標(biāo)簽頁(yè)

selenium接管的主要代碼

options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")

關(guān)閉瀏覽器窗口

1、使用瀏覽器對(duì)象的close()方法,quit()方法不行。

2、手動(dòng)打開,手動(dòng)關(guān)閉

完整登陸代碼

# coding:utf-8

import cv2 as cv
import time
import random
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as WAIT
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from urllib.request import urlretrieve


class Zhihu_login:
    '''知乎模擬登陸'''

    def __init__(self):
        options = webdriver.ChromeOptions()
        #操控chrome瀏覽器
        options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
        self.driver = webdriver.Chrome(options=options)
        self.wait = WAIT(self.driver, 5)
        self.url = 'https://www.zhihu.com/'
        self.bg_img_path = './bg.png'
        self.slider_img_path = './slider.png'


    def run(self):
        '''執(zhí)行入口'''

        self.driver.get(self.url)
        try:
            if WAIT(self.driver,3).until(EC.presence_of_element_located((By.ID,'Popover15-toggle'))):
                print('登陸成功')
                self.save_cookie()
                self.driver.close()
        except:
            # 切換到密碼登陸
            self.wait.until(EC.element_to_be_clickable((By.XPATH, '//div[contains(@class,"SignFlow-tabs")]/div[2]'))).click()
            name_input = self.driver.find_element_by_name('username')
            name_input.clear()
            name_input.send_keys('賬號(hào)')
            pass_input = self.driver.find_element_by_name('password')
            pass_input.clear()
            pass_input.send_keys('密碼')
            self.wait.until(EC.element_to_be_clickable((By.XPATH, '//button[@type="submit"]'))).click()  # 點(diǎn)擊登陸按鈕
            time.sleep(1)
            #進(jìn)行滑動(dòng)驗(yàn)證,最多嘗試5次重新驗(yàn)證
            if self.slide_verify():
                print('登陸成功')
                self.save_cookie()
                self.driver.close()
            else:
                print('第1次登陸失敗')
                for i in range(4):
                    print('正在嘗試第%d次登陸'%(i+2))
                    if self.slide_verify():
                        print('第%d次登陸成功'%(i+2))
                        self.save_cookie()
                        self.driver.close()
                        return
                    print('第%d次登陸失敗' % (i + 2))
                print('登陸失敗5次,停止登陸')
                self.driver.close()


    def slide_verify(self):
        '''滑動(dòng)驗(yàn)證'''

        slider_button = self.wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@class="yidun_slider"]')))
        self.bg_img_url = self.wait.until(EC.presence_of_element_located((By.XPATH, '//img[@class="yidun_bg-img"]'))).get_attribute('src')  # 獲取驗(yàn)證碼背景圖url
        self.slider_img_url = self.wait.until(EC.presence_of_element_located((By.XPATH, '//img[@class="yidun_jigsaw"]'))).get_attribute('src')  # 獲取驗(yàn)證碼滑塊圖url
        urlretrieve(self.bg_img_url, self.bg_img_path)
        urlretrieve(self.slider_img_url, self.slider_img_path)
        distance = self.get_distance(self.bg_img_path, self.slider_img_path)
        distance += 10  # 實(shí)際移動(dòng)距離需要向右偏移10px
        tracks = self.get_tracks(distance)
        self.mouse_move(slider_button,tracks)
        try:
            element = self.wait.until(EC.presence_of_element_located((By.ID,'Popover15-toggle')))
        except:
            return False
        else:
            return True

    def save_cookie(self):
        cookie = {}
        for item in self.driver.get_cookies():
            cookie[item['name']] = item['value']
        print(cookie)
        print('成功獲取登陸知乎后的cookie信息')


    def mouse_move(self,slide,tracks):
        '''鼠標(biāo)滑動(dòng)'''

        #鼠標(biāo)點(diǎn)擊滑塊并按照不放
        ActionChains(self.driver).click_and_hold(slide).perform()
        #按照軌跡進(jìn)行滑動(dòng),
        for track in tracks:
            ActionChains(self.driver).move_by_offset(track, 0).perform()
        ActionChains(self.driver).release(slide).perform()


    def get_distance(self, bg_img_path='./bg.png', slider_img_path='./slider.png'):
        """獲取滑塊移動(dòng)距離"""

        # 背景圖片處理
        bg_img = cv.imread(bg_img_path, 0)  # 讀入灰度圖片
        bg_img = cv.GaussianBlur(bg_img, (3, 3), 0)  # 高斯模糊去噪
        bg_img = cv.Canny(bg_img, 50, 150)  # Canny算法進(jìn)行邊緣檢測(cè)
        # 滑塊做同樣處理
        slider_img = cv.imread(slider_img_path, 0)
        slider_img = cv.GaussianBlur(slider_img, (3, 3), 0)
        slider_img = cv.Canny(slider_img, 50, 150)
        # 尋找最佳匹配
        res = cv.matchTemplate(bg_img, slider_img, cv.TM_CCOEFF_NORMED)
        # 最小值,最大值,并得到最小值, 最大值的索引
        min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
        # 例如:(-0.05772797390818596, 0.30968162417411804, (0, 0), (196, 1))
        top_left = max_loc[0]  # 橫坐標(biāo)
        return top_left


    def get_tracks(self, distance):
        '''滑動(dòng)軌跡 '''

        tracks = []
        v = 0
        t = 0.2  # 單位時(shí)間
        current = 0  # 滑塊當(dāng)前位移
        distance += 10  # 多移動(dòng)10px,然后回退
        while current < distance:
            if current < distance * 5 / 8:
                a = random.randint(1, 3)
            else:
                a = -random.randint(2, 4)
            v0 = v  # 初速度
            track = v0 * t + 0.5 * a * (t ** 2)  # 單位時(shí)間(0.2s)的滑動(dòng)距離
            tracks.append(round(track))  # 加入軌跡
            current += round(track)
            v = v0 + a * t
        #回退到大致位置
        for i in range(5):
            tracks.append(-random.randint(1, 3))
        return tracks


if __name__ == '__main__':
    Zhihu_login().run()

到此這篇關(guān)于python爬蟲之利用selenium+opencv識(shí)別滑動(dòng)驗(yàn)證并模擬登陸知乎的文章就介紹到這了,更多相關(guān)selenium+opencv滑動(dòng)驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python詞云展示庫(kù)wordcloud配置詳解

    Python詞云展示庫(kù)wordcloud配置詳解

    這篇文章主要介紹了Python詞云展示庫(kù)wordcloud配置詳解,詞云就是將詞語(yǔ)通過(guò)圖形可視化的方式,直觀和藝術(shù)的展示出來(lái),詞云在我們的生活中經(jīng)常能夠看到,無(wú)論是中文的詞云還是英文的詞云,需要的朋友可以參考下
    2023-07-07
  • Sanic框架流式傳輸操作示例

    Sanic框架流式傳輸操作示例

    這篇文章主要介紹了Sanic框架流式傳輸操作,結(jié)合實(shí)例形式分析了Sanic通過(guò)流請(qǐng)求與響應(yīng)傳輸操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下
    2018-07-07
  • Python線程編程之Thread詳解

    Python線程編程之Thread詳解

    這篇文章主要為大家介紹了Python線程編程之Thread,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • 你所不知道的Python技巧13招【實(shí)用】

    你所不知道的Python技巧13招【實(shí)用】

    有時(shí)候你會(huì)看到很Cool的Python代碼,你驚訝于它的簡(jiǎn)潔,你不由自主地贊嘆:竟然還能這樣寫,其實(shí),這些優(yōu)雅的代碼都要?dú)w功于Python的特性,只要你能掌握這些Pythonic的技巧,你一樣可以寫出像詩(shī)一樣的Python代碼,本文主要介紹Python應(yīng)用的一些小技巧,一起來(lái)看下吧
    2016-12-12
  • python中驗(yàn)證碼連通域分割的方法詳解

    python中驗(yàn)證碼連通域分割的方法詳解

    這篇文章主要給大家介紹了關(guān)于python中驗(yàn)證碼連通域分割的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果

    Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果

    這篇文章主要介紹了Python基于pygame實(shí)現(xiàn)圖片代替鼠標(biāo)移動(dòng)效果,可實(shí)現(xiàn)將鼠標(biāo)箭頭轉(zhuǎn)換成圖形的功能,涉及pygame圖形操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • Python獲取指定網(wǎng)段正在使用的IP

    Python獲取指定網(wǎng)段正在使用的IP

    這篇文章主要介紹了Python獲取指定網(wǎng)段正在使用的IP的示例代碼,幫助大家更好的利用python進(jìn)行測(cè)試,感興趣的朋友可以了解下
    2020-12-12
  • 手把手教你用322行Python代碼編寫貪吃蛇游戲

    手把手教你用322行Python代碼編寫貪吃蛇游戲

    最近在學(xué)Python,想做點(diǎn)什么來(lái)練練手,命令行的貪吃蛇一般是C的練手項(xiàng)目,但是一時(shí)之間找不到別的,就先做個(gè)貪吃蛇來(lái)練練簡(jiǎn)單的語(yǔ)法,下面這篇文章主要給大家介紹了關(guān)于如何用322行Python代碼編寫貪吃蛇游戲的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Pycharm配置Anaconda環(huán)境的詳細(xì)圖文教程

    Pycharm配置Anaconda環(huán)境的詳細(xì)圖文教程

    PyCharm是一款很好用很流行的python編輯器,Anaconda通過(guò)管理工具包、開發(fā)環(huán)境、Python版本,大大簡(jiǎn)化了你的工作流程,下面這篇文章主要給大家介紹了關(guān)于Windows系統(tǒng)下Pycharm配置Anaconda環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • pycharm 安裝JPype的教程

    pycharm 安裝JPype的教程

    這篇文章主要介紹了pycharm 安裝JPype的步驟,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論