1. 程式人生 > >Python網路爬蟲之極驗滑動驗證碼識別

Python網路爬蟲之極驗滑動驗證碼識別

在這裡插入圖片描述

驗證碼分析

使用程式碼完成極驗驗證碼的識別,需要了解一下幾點:

  • 通過該驗證碼的識別動作為:點選並拖拽滑塊 - 滑動滑塊至缺口處 - 釋放滑鼠
  • 該驗證碼增加了機器學習來識別拖動的軌跡,即:人不可能實現勻速拖拽
    所以為解決被識別出為非人為拖拽,則控制拖拽的速度,一般人的拖拽為先加速後減速。
    為模擬人的行為,使用Selenium工具。

程式碼分析:

定義CrackGeetest()類,該類中定義通過該驗證碼的方法。

  • open():開啟網頁,並輸入賬戶和密碼
  • get_geetest_button():當輸入完賬戶和密碼後,獲取點選驗證碼的按鈕,如下圖:
    在這裡插入圖片描述
  • get_position():通過標籤,獲取驗證碼圖片在網頁中的位置
  • get_screenshot():獲取網頁的截圖
  • get_geetest_image():通過網頁截圖和圖片位置擷取驗證碼圖片
  • get_slider():獲取滑塊的按鈕
  • get_track():根據隨機生成的缺口位置獲取移動軌跡
  • move_to_gap():根據移動軌跡移動滑塊
  • login():通過驗證後,登入
  • is_try_again():當驗證到一定次數時將提示驗證過多,判斷驗證該提示是否出現,若出現則點選重試,如下圖:
    在這裡插入圖片描述
  • is_success():判斷是否通過驗證,如下圖:
    在這裡插入圖片描述
  • for_move():根據隨機生成的缺口位置,逐漸改變缺口位置,進行迴圈嘗試驗證
  • crack():開始驗證方法,並隨機判斷缺口在圖片的左邊還是右邊
程式碼:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import time
from io import BytesIO
from PIL import Image
from selenium.webdriver import ActionChains
from selenium.common.exceptions import TimeoutException
import random

"""[summary]
使用極驗滑動驗證碼的官網為例,若沒有賬號先註冊。
"""
EMAIL = '
[email protected]
' PASSWORD = '密碼' class CrackGeetest(): """[summary] 初始化 """ def __init__(self): self.url = 'https://account.geetest.com/login' self.browser = webdriver.Chrome() self.wait = WebDriverWait(self.browser, 5) self.email = EMAIL self.password = PASSWORD def __del__(self): self.browser.close() def open(self): """[summary] 輸入使用者及密碼 """ self.browser.get(self.url) email = self.wait.until(EC.presence_of_element_located((By.ID, 'email'))) password = self.wait.until(EC.presence_of_element_located((By.ID, 'password'))) email.send_keys(self.email) password.send_keys(self.password) def get_geetest_button(self): """[summary] 獲取初始驗證按鈕 返回按鈕物件 """ button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip'))) return button # 餘下程式碼見GitHub
通過驗證:

在這裡插入圖片描述