天天看點

Python爬蟲入門教程 59-100 python爬蟲進階技術之驗證碼篇5-極驗證識别技術之二

@[toc]

圖檔比對

昨天的部落格已經将圖檔存儲到了本地,今天要做的第一件事情,就是需要在兩張圖檔中進行比對,将圖檔缺口定位出來

缺口圖檔

Python爬蟲入門教程 59-100 python爬蟲進階技術之驗證碼篇5-極驗證識别技術之二

完整圖檔

Python爬蟲入門教程 59-100 python爬蟲進階技術之驗證碼篇5-極驗證識别技術之二

計算缺口坐标

對比兩張圖檔的所有RBG像素點,得到不一樣像素點的x值,即要移動的距離

def get_distance(self,cut_image,full_image):

        # print(cut_image.size)
        threshold = 50
        for i in range(0,cut_image.size[0]):
            for j in range(0,cut_image.size[1]):
                pixel1 = cut_image.getpixel((i, j))
                pixel2 = full_image.getpixel((i, j))
                res_R = abs(pixel1[0] - pixel2[0])  # 計算RGB差
                res_G = abs(pixel1[1] - pixel2[1])  # 計算RGB差
                res_B = abs(pixel1[2] - pixel2[2])  # 計算RGB差

                if res_R > threshold and res_G > threshold and res_B > threshold:
                    return i  # 需要移動的距離
           

極驗證對于使用者行為檢測是有專門的算法的,找到一篇比較老的文章

https://blog.csdn.net/ieternite/article/details/51483491

如果我們直接把上面算出來的缺口位置放到前面腳本裡,你會發現即使移動的位置正确了,提示卻是“怪物吃了餅圖”,驗證不通過。很顯然,geetest識别出了這個動作并不是人的行為。這我們就需要去檢視自然人滑動滑鼠和我們代碼實作的滑動在軌迹上有什麼不同。

滑鼠拖動滑塊進行移動的時候,也是遵循人類行為的,這個地方,你可以參考文章

https://www.cnblogs.com/xiao-apple36/p/8878960.html

移動滑塊

這部分和我們之前滑動驗證碼識别是一緻的,通過selenium進行人行為實作

# 移動滑塊
    def start_move(self, distance):
        element = self.driver.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]')


        # 使用滑塊的一半進行偏移設定
        distance -= element.size.get('width') / 2
        distance += 15

        # 按下滑鼠左鍵
        ActionChains(self.driver).click_and_hold(element).perform()
        time.sleep(0.5)
        while distance > 0:
            if distance > 20:
                # 如果距離大于20,就讓他移動快一點
                span = random.randint(5, 8)
            else:
                # 快到缺口了,就移動慢一點
                span = random.randint(2, 3)
            ActionChains(self.driver).move_by_offset(span, 0).perform()
            distance -= span
            time.sleep(random.randint(10, 50) / 100)

        ActionChains(self.driver).move_by_offset(distance, 1).perform()
        ActionChains(self.driver).release(on_element=element).perform()
           

運作效果,第一次驗證失敗了,等待7秒左右進行第二次驗證,注意成功了。

Python爬蟲入門教程 59-100 python爬蟲進階技術之驗證碼篇5-極驗證識别技術之二

最後要調整的是驗證失敗,需要重複驗證

驗證失敗

驗證失敗,在拖動的下面繼續編寫即可,屬于正常的邏輯代碼了

self.start_move(dis)

        # 如果出現錯誤
        try:
            WebDriverWait(self.driver, 5).until(
                EC.element_to_be_clickable((By.XPATH, '//div[@class="gt_ajax_tip gt_error"]')))
            print("驗證失敗")
            return
        except TimeoutException as e:
            pass

        # 判斷是否驗證成功
        try:
            WebDriverWait(self.driver, 10).until(
                EC.element_to_be_clickable((By.XPATH, '//div[@class="gt_ajax_tip gt_success"]')))
        except TimeoutException:
            print("重新驗證....")
            time.sleep(5)
            # 失敗後遞歸執行拖動
            self.analog_drag()
        else:
            print("驗證成功")
           

寫在後面

到此為止,極驗證已經編寫完畢,代碼中還有很多地方需要進行調整

例如

element = self.driver.find_element_by_xpath('//div[@class="gt_slider_knob gt_show"]') 
           

上面擷取元素的方式,很容易導緻目标元素沒有捕獲到,然後項目直接報錯退出,是以需要進行完善

driver 需要及時的關閉,否則會在你的任務管理器中出現大量的

chromedriver.exe

程序

Python爬蟲入門教程 59-100 python爬蟲進階技術之驗證碼篇5-極驗證識别技術之二

極驗證驗證碼破解方式基本遵循滑動驗證碼,核心内容在于兩個圖檔的處理,希望你可以學習到。

掃碼關注微信公衆賬号,回複0321擷取驗證碼源碼

繼續閱讀