Python網路爬蟲之極驗滑動驗證碼識別
阿新 • • 發佈:2018-12-11
驗證碼分析
使用程式碼完成極驗驗證碼的識別,需要了解一下幾點:
- 通過該驗證碼的識別動作為:點選並拖拽滑塊 - 滑動滑塊至缺口處 - 釋放滑鼠
- 該驗證碼增加了機器學習來識別拖動的軌跡,即:人不可能實現勻速拖拽
所以為解決被識別出為非人為拖拽,則控制拖拽的速度,一般人的拖拽為先加速後減速。
為模擬人的行為,使用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