首页 > Python基础教程 >
-
爬虫(十二):图形验证码的识别、滑动验证码的识(2)
阔值110时:
阔值125时:
实在是把我弄自闭了,中间的值更加奇怪 ,技术不到家就是这样吧。
然后我又换了几次验证码,结果如下:
终于是成功了一次了,所以这个案例告诉我们,识别不出来,就刷新换下一张,瞎猫总会碰到死耗子。
而在真正的项目中,都会判断是否验证码错误,验证码错误就刷新验证码,重新输入。
遇到那种失败就会跳转界面的,那就只能重启任务了。
1.3 滑动验证码的识别
滑动验证码需要拖动拼合滑块才能完成验证,相对于图形验证码来说识别难度上升了几个等级。制作滑动验证码的公司叫做GEETEST,官网是https://www.geetest.com/。主要验证方式是拖动滑块破解图像。若图像完全拼合,则验证成功,即表单成功提交,否则需要重新验证。
1.3.1 滑动验证码特点
滑动验证码相较于图形验证码来说识别难度更大。现在极验验证码已经更新到3.0版本,对于极验验证码 3.0 版本,我们首先点击按钮进行智能验证。如果验证不通过,则会弹出滑动验证的窗口,拖动滑块拼合图像进行验证。之后三个加密参数会生成,通过表单提交到后台,后台还会进行一次验证。
极验验证码还增加了机器学习的方法来识别拖动轨迹。官方网站的安全防护有如下几点说明:
三角防护之防模拟:恶意程序模仿人类行为轨迹对验证码进行识别。针对模拟,极验验证码拥有超过4000万人机行为样本的海量数据。利用机器学习和神经网络,构建线上线下的多重静态、动态防御模型。识别模拟轨迹,界定人机边界。
三角防护之防伪造:恶意程序通过伪造设备浏览器环境对验证码进行识别。针对伪造,极验验证码利用设备基因技术。深度分析浏览器的实际性能来辨识伪造信息。同时根据伪造事件不断更新黑名单,大幅提高防伪造能力。
三角防护之防暴力:恶意程序短时间内进行密集的攻击,对验证码进行暴力识别。针对暴 力,极验验证码拥有多种验证形态,每一种验证形态都有利用神经网络生成的海蓝图库储 备,每一张图片都是独一无二的,且图库不断更新,极大程度提高了暴力识别的成本。
另外,极验验证码的验证相对于普通验证方式更方便,体验更友好,其官方网站说明如下:
点击一下,验证只需要0.4秒。极验验证码始终专注于去验证化实践,让验证环节不再打断产品本身的交互流程,最终达到优化用户体验和提高用户转化率的效果。
全平台兼容 ,适用各种交互场景。极验验证码兼容所有主流浏览器甚至于古老的IE6,也可以轻松应用在iOS和Android移动端平台,满足各种业务需求,保护网站资源不被滥用和监取。
面向未来,懂科技,更懂人性。极验验证码在保障安全同时不断致力于提升用户体验、精雕细琢的验证面板、流畅顺滑的验证动画效果,让验证过程不再枯燥乏味。
相比一般验证码,极验验证码的验证安全性和易用性有了非常大的提高。
1.3.2 实现思路
对于应用了极验验证码的网站,如果我们直接模拟表单提交,加密参数的构造是个问题,需要分析其加密和校验逻辑,非常的复杂。但是我们如果采用模拟浏览器动作的方式来完成验证,就会变得很简单了。在python中,我们可以使用selenium来模拟人的行为来完成验证、此验证成本相对与直接去识别加密算法少得多。
首先找到一个带有极验验证码的网站,如B站,链接为:https://passport.bilibili.com/login。输入账号密码点击登录,极验验证码就会弹出来。
所以我们这个识别验证案例 完成需要三步:
- 输入账号密码,点击登录
- 识别滑动缺口的位置
- 模拟拖动滑块
第一步操作最简单,我们可以直接用selenium完成。
第二步操作识别缺口的位置比较关键,这里需要用到图像的相关处理方法。首先观察缺口的样子。
缺口的四周边缘又明显的断裂边缘,边缘和边缘周围又明显的区别。我们可以实现一个边缘检测算法来找出缺口的位置。对于极验验证码来说,我们可以利用和原图对比检测的方式来识别缺口的位置,因为在没有滑动滑块之前, 缺口并没有呈现。
我们可以同时获取两张图片。设定一个对比阔值,然后遍历两张图片,找出相同位置像素RGB差距超过此阔值的像素点,那么此像素点的位置就是缺口的位置 。
第三步操作看似简单,但其中的坑比较多。极验验证码增加了机器轨迹识别,匀速移动、随机速度移动等方法都不能通过验证,只有完全模拟人的移动轨迹才可以通过验证。人的移动轨迹一般是先加速后减速,我们需要模拟这个过程才能成功。
有了思路后,我们就用代码来实现极验验证码的识别过程吧。
1.3.3 初始化
我们先初始化一些配置,如selenium对象的初始化及一些参数的配置。
- # -*- coding:utf-8 -*-
- from PIL import Image
- from time import sleep
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver import ActionChains
- from selenium.webdriver.support.wait import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36"
- }
- chrome_options = webdriver.ChromeOptions()
- chrome_options.add_experimental_option('w3c', False)
- caps = DesiredCapabilities.CHROME
- caps['loggingPrefs'] = {'performance': 'ALL'}
- class SliderVerificationCode(object):
- def __init__(self): # 初始化一些信息
- self.left = 60 # 定义一个左边的起点 缺口一般离图片左侧有一定的距离 有一个滑块
- self.url = 'https://passport.bilibili.com/login'
- self.driver = webdriver.Chrome(desired_capabilities=caps,options=chrome_options)
- self.wait = WebDriverWait(self.driver, 20) # 设置等待时间20秒
- self.phone = "17369251763" #乱输就行
- self.passwd = "abcdefg" #乱输就行
phone和passwd就是登录B站的账号和密码。
1.3.4 模拟用户登录
输入账号密码:
- def input_name_password(self): # 输入账号密码
- self.driver.get(self.url)
- self.driver.maximize_window() # 窗口最大化
- input_name = self.driver.find_element_by_xpath("//input[@id='login-username']")
- input_pwd = self.driver.find_element_by_xpath("//input[@id='login-passwd']")
- input_name.send_keys("username")
- input_pwd.send_keys("passport")
点击登录按钮,等待验证码图片加载
- def click_login_button(self): # 点击登录按钮,出现验证码图片
- login_btn =