VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 爬虫(十二):图形验证码的识别、滑动验证码的识(2)

code.png')
  • dict1 = client.general(image)
  • with codecs.open('code1' + ".txt", "w", "utf-8") as f:
  • for i in dict1["words_result"]:
  • f.write(str(i["words"] + "\r\n"))
  •   print("处理完成")
  •  
  • if __name__ == '__main__':
  • main()
  • 阔值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。输入账号密码点击登录,极验验证码就会弹出来。

    所以我们这个识别验证案例 完成需要三步:

    1. 输入账号密码,点击登录
    2. 识别滑动缺口的位置
    3. 模拟拖动滑块

    第一步操作最简单,我们可以直接用selenium完成。

    第二步操作识别缺口的位置比较关键,这里需要用到图像的相关处理方法。首先观察缺口的样子。

    缺口的四周边缘又明显的断裂边缘,边缘和边缘周围又明显的区别。我们可以实现一个边缘检测算法来找出缺口的位置。对于极验验证码来说,我们可以利用和原图对比检测的方式来识别缺口的位置,因为在没有滑动滑块之前, 缺口并没有呈现。

    我们可以同时获取两张图片。设定一个对比阔值,然后遍历两张图片,找出相同位置像素RGB差距超过此阔值的像素点,那么此像素点的位置就是缺口的位置 。

    第三步操作看似简单,但其中的坑比较多。极验验证码增加了机器轨迹识别,匀速移动、随机速度移动等方法都不能通过验证,只有完全模拟人的移动轨迹才可以通过验证。人的移动轨迹一般是先加速后减速,我们需要模拟这个过程才能成功。

    有了思路后,我们就用代码来实现极验验证码的识别过程吧。

    1.3.3 初始化

    我们先初始化一些配置,如selenium对象的初始化及一些参数的配置。

    
    	
    1. # -*- coding:utf-8 -*-
    2. from PIL import Image
    3. from time import sleep
    4. from selenium import webdriver
    5. from selenium.webdriver.common.by import By
    6. from selenium.webdriver import ActionChains
    7. from selenium.webdriver.support.wait import WebDriverWait
    8. from selenium.webdriver.support import expected_conditions as EC
    9. from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
    10.  
    11. headers = {
    12. "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"
    13. }
    14. chrome_options = webdriver.ChromeOptions()
    15. chrome_options.add_experimental_option('w3c', False)
    16. caps = DesiredCapabilities.CHROME
    17. caps['loggingPrefs'] = {'performance': 'ALL'}
    18.  
    19. class SliderVerificationCode(object):
    20. def __init__(self): # 初始化一些信息
    21. self.left = 60 # 定义一个左边的起点 缺口一般离图片左侧有一定的距离 有一个滑块
    22. self.url = 'https://passport.bilibili.com/login'
    23. self.driver = webdriver.Chrome(desired_capabilities=caps,options=chrome_options)
    24. self.wait = WebDriverWait(self.driver, 20) # 设置等待时间20秒
    25. self.phone = "17369251763" #乱输就行
    26. self.passwd = "abcdefg" #乱输就行

    phone和passwd就是登录B站的账号和密码。

    1.3.4 模拟用户登录

    输入账号密码:

    
    	
    1. def input_name_password(self): # 输入账号密码
    2. self.driver.get(self.url)
    3. self.driver.maximize_window() # 窗口最大化
    4. input_name = self.driver.find_element_by_xpath("//input[@id='login-username']")
    5. input_pwd = self.driver.find_element_by_xpath("//input[@id='login-passwd']")
    6. input_name.send_keys("username")
    7. input_pwd.send_keys("passport")

    点击登录按钮,等待验证码图片加载

    
    	
    1. def click_login_button(self): # 点击登录按钮,出现验证码图片
    2. login_btn =
    
    相关教程