Python网络爬虫之极验滑动验证码识别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38038143/article/details/82821635

极验验证码示例(https://account.geetest.com/login):

在这里插入图片描述

验证码分析

使用代码完成极验验证码的识别,需要了解一下几点:

  • 通过该验证码的识别动作为:点击并拖拽滑块 - 滑动滑块至缺口处 - 释放鼠标
  • 该验证码增加了机器学习来识别拖动的轨迹,即:人不可能实现匀速拖拽
    所以为解决被识别出为非人为拖拽,则控制拖拽的速度,一般人的拖拽为先加速后减速。
    为模拟人的行为,使用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

点击:GitHub

通过验证:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38038143/article/details/82821635
今日推荐