爬虫入门经典(十八) | 滑动验证码识别

不温卜火 等级 638 0 0
标签: picPython

  大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行更新,博客主页:https://buwenbuhuo.blog.csdn.net/爬虫入门经典(十八) | 滑动验证码识别

PS:由于现在越来越多的人未经本人同意直接爬取博主本人文章,博主在此特别声明:未经本人允许,禁止转载!!!

目录


爬虫入门经典(十八) | 滑动验证码识别


推荐

爬虫入门经典(十八) | 滑动验证码识别
  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥
爬虫入门经典(十八) | 滑动验证码识别

一、小小课堂

在上篇博文中已经完成了破解文字验证码,接下来我们完成滑动验证码,在此以豆瓣登录验证为例。
爬虫入门经典(十八) | 滑动验证码识别
滑块验证的步骤,其实上一篇博文已经讲解了,不知道各位同学有没有印象,如果没有也没有关系,下面博主会在此写出步骤:

步骤:
(1)计算滑动距离
(2)模拟人滑动(总体思路是先快再慢)

下面我们先来看下豆瓣登录界面
爬虫入门经典(十八) | 滑动验证码识别
这个时候我们通过输错密码的方法,使其出现验证码。
爬虫入门经典(十八) | 滑动验证码识别
多滑动和刷新几次,发现一些规律,y轴不变,x轴在变化,豆瓣这个滑动验证码,x轴距离大概207左右,如果需要精确测量,需要使用像素对比。
爬虫入门经典(十八) | 滑动验证码识别
接来下通过selenium找到滑块,移动就行了,但是有一个问题,如果直接(x1,y1)移动到(x2,y2),相当于瞬移的效果,时间非常短,可能会被对方检测到。
爬虫入门经典(十八) | 滑动验证码识别
接下来需要使用模拟真实人的点击滑动轨迹,一般是先加速再加速,假设是匀加速和匀减速。
滑动之后,如果不通过,可以刷新按钮,再进行滑动,直到通过(因为通过后一般页面开始跳转title不同或找其他的对比找到不同)

二、模拟匀加速和匀减速

爬虫入门经典(十八) | 滑动验证码识别

代码实现:

def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    将distance分割成小段的距离
    :param distance: 总距离
    :param rate: 加速减速的临界比例
    :param a1: 加速度
    :param a2: 减速度
    :param t: 单位时间
    :param t: 初始速度
    :return: 小段的距离集合
    """
    tracks = []
    # 加速减速的临界值
    mid = rate * distance
    # 当前位移
    s = 0
    # 循环
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 计算当前t时间段走的距离
        s0 = v0 * t + 0.5 * a * t * t
        # 计算当前速度
        v = v0 + a * t
        # 四舍五入距离,因为像素没有小数
        tracks.append(round(s0))
        # 计算当前距离
        s += s0

    return tracks

if __name__ == '__main__':
    tracks = get_tracks(100)
    print(tracks)
    print(sum(tracks)) 

下面我们来看下运行结果:
爬虫入门经典(十八) | 滑动验证码识别
我们可以看到已经完成了模拟匀加速与匀减速的操作。

三、分析登录页面

爬虫入门经典(十八) | 滑动验证码识别
首先通过URL,我们找到了https://accounts.douban.com/passport/login

打开之后的页面如下:
爬虫入门经典(十八) | 滑动验证码识别
下面我们先来看下正常人是怎样登录豆瓣的。
爬虫入门经典(十八) | 滑动验证码识别
🆗,下面我们就开始分析页面,通过selenium完成这些操作。

3.1 分析网页结构

爬虫入门经典(十八) | 滑动验证码识别

    1. 密码登录
//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2] 

爬虫入门经典(十八) | 滑动验证码识别

  • 2.用户账号
    爬虫入门经典(十八) | 滑动验证码识别
  • 3.用户密码
    爬虫入门经典(十八) | 滑动验证码识别
    1. 登录豆瓣
      爬虫入门经典(十八) | 滑动验证码识别
    1. 找到滑块
      爬虫入门经典(十八) | 滑动验证码识别
  • 刷新按钮
    爬虫入门经典(十八) | 滑动验证码识别
    分析完成,下面就开始代码实现了

3.2 代码实现

url = "https://accounts.douban.com/passport/login"
driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
driver.get(url)
print("当前的title:",driver.title)

driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
driver.find_element_by_xpath('//*[@id="username"]').send_keys("账号")
driver.find_element_by_xpath('//*[@id="password"]').send_keys("密码")
driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
# 停一下,等待出现
time.sleep(2)

# 切换iframe
driver.switch_to.frame(1)
block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
reload = driver.find_element_by_xpath('//*[@id="reload"]')

# 滑动操作时需要动作链
# 摁下滑块
ActionChains(driver).click_and_hold(block).perform()
# 移动
ActionChains(driver).move_by_offset(180, 0).perform()
# 获取位移
tracks = get_tracks(30)
# 循环
for track in tracks:
    # 移动
    ActionChains(driver).move_by_offset(track, 0).perform()
# 释放
ActionChains(driver).release().perform()
# 判断
if driver.title == "登录豆瓣":
    print("失败...再来一次...")
    # 单击刷新按钮刷新
    reload.click()
    # 停一下
    time.sleep(2)
else:
    print("成功!")

time.sleep(5)
driver.quit() 

3.3 登录过程测试

爬虫入门经典(十八) | 滑动验证码识别

四、完整代码

# encoding: utf-8
'''
  @author 李华鑫
  @create 2020-10-10 14:41
  Mycsdn:https://buwenbuhuo.blog.csdn.net/
  @contact: 459804692@qq.com
  @software: Pycharm
  @file: 豆瓣登录.py
  @Version:1.0

'''
import requests
import time
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

def get_tracks(distance, rate=0.6, t=0.2, v=0):
    """
    将distance分割成小段的距离
    :param distance: 总距离
    :param rate: 加速减速的临界比例
    :param a1: 加速度
    :param a2: 减速度
    :param t: 单位时间
    :param t: 初始速度
    :return: 小段的距离集合
    """
    tracks = []
    # 加速减速的临界值
    mid = rate * distance
    # 当前位移
    s = 0
    # 循环
    while s < distance:
        # 初始速度
        v0 = v
        if s < mid:
            a = 20
        else:
            a = -3
        # 计算当前t时间段走的距离
        s0 = v0 * t + 0.5 * a * t * t
        # 计算当前速度
        v = v0 + a * t
        # 四舍五入距离,因为像素没有小数
        tracks.append(round(s0))
        # 计算当前距离
        s += s0

    return tracks

def slide(driver):
    """滑动验证码"""
    # 切换iframe
    driver.switch_to.frame(1)
    #找到滑块
    block = driver.find_element_by_xpath('//*[@id="tcaptcha_drag_button"]')
    #找到刷新
    reload = driver.find_element_by_xpath('//*[@id="reload"]')
    while True:
        # 摁下滑块
        ActionChains(driver).click_and_hold(block).perform()
        # 移动
        ActionChains(driver).move_by_offset(180, 0).perform()
        #获取位移
        tracks = get_tracks(30)
        #循环
        for track in tracks:
            #移动
            ActionChains(driver).move_by_offset(track, 0).perform()
        # 释放
        ActionChains(driver).release().perform()
        #停一下
        time.sleep(2)
        #判断
        if driver.title == "登录豆瓣":
            print("失败...再来一次...")
            #单击刷新按钮刷新
            reload.click()
            # 停一下
            time.sleep(2)
        else:
            break

def main():
    """主程序"""
    url = "https://accounts.douban.com/passport/login"
    driver = webdriver.Chrome("./chromedriver/chromedriver.exe")
    driver.get(url)
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]').click()
    driver.find_element_by_xpath('//*[@id="username"]').send_keys("账号")
    driver.find_element_by_xpath('//*[@id="password"]').send_keys("密码")
    driver.find_element_by_xpath('//*[@id="account"]/div[2]/div[2]/div/div[2]/div[1]/div[4]/a').click()
    # 停一下,等待出现
    time.sleep(2)
    #滑动验证码
    slide(driver)

    print("成功")
    driver.quit()

if __name__ == '__main__':
    main() 

爬虫入门经典(十八) | 滑动验证码识别

美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!


爬虫入门经典(十八) | 滑动验证码识别

  好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
  如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论”“收藏”一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
  码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!

爬虫入门经典(十八) | 滑动验证码识别
爬虫入门经典(十八) | 滑动验证码识别

本文转自 https://buwenbuhuo.blog.csdn.net/article/details/109180320,如有侵权,请联系删除。

收藏
评论区

相关推荐

爬虫入门经典(十) | 一文带你快速爬取网易云音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十四) | 使用selenium尝试爬取豆瓣图书
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十五) | 邪恶想法之爬取百度妹子图
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十七) | 图形验证码识别
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十八) | 滑动验证码识别
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(十九) | 难度提升,破解极验验证码
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
爬虫入门经典(二十三) | fiddler抓包爬取QQ音乐
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语—不温不火,本意是希望自己性情温和。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!暂时只在csdn这一个平台进行
IE6下显示透明PNG及PNG8白边之解决
IE6下显示透明PNG及PNG8白边之解决 2011年05月16日 星期一 17:27 **1、首先我们在PS中准备好范例中需要的图片素材** ![](http://hiphotos.baidu.com/%B4%F3%CE%B0/pic/item/2f7403e98ffa0d64b90e2ddf.jpg) **2、我们看看在IE6下改图是怎么呈现的*
PIC中档单片机汇编指令详解(5)
位操作指令详述 BCF 数据寄存器指定位清0 语法形式:BCF f,b 操作数:f为数据寄存器的低7位地址(0x00~0x7F) B为数据位编号(0~7) 执行时间:一个指令周期 执行过程:使数据寄存器f的的b位清0 状态标志影响:无 说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。 指
OpenKruise v0.7.0 版本发布:新增周期任务分发控制器
![头图.png](https://ucc.alicdn.com/pic/developer-ecology/ac231db730d3466f8f25074fdb07d4f4.png) 作者 | 王思宇(酒祝) 来源|[阿里巴巴云原生公众号](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2
Python下载网络图片方法汇总与实现
\> 本文介绍下载python下载网络图片的方法,包括通过图片url直接下载、通过re/beautifulSoup解析html下载以及对动态网页的处理等。 \>​本期小编推送2021初学者一定会用到的Python资料,含有小编自己呕心沥血整理的免费书籍/视频/在线文档和编辑器/源代码,关于\`Python\`的安装qun:850973621 \##
Sentinel
![9.28头图.png](https://ucc.alicdn.com/pic/developer-ecology/af7ab6c27c3c4c3aa5dc2cce3c9e8ab9.png) > \*\*导读:\*\*2020年,Sentinel 推出 Go 原生版本[Sentinel-Golang](https://www.oschina.net/ac
Serverless Kubernetes:理想,现实与未来
![头图.png](https://ucc.alicdn.com/pic/developer-ecology/5274aa0e51324dfba409709d025ad7f5.png) 作者 | 易立、张维 来源 | [阿里巴巴云原生公众号](https://www.oschina.net/action/GoToLink?url=https%3A%2F%2
Serverless 如何在阿里巴巴实现规模化落地?
![头图.jpg](https://ucc.alicdn.com/pic/developer-ecology/e8d89c506e9e4421b81212dc28159e32.jpg) 作者 | 赵庆杰(卢令) 来源 | [Serverless 公众号](https://www.oschina.net/action/GoToLink?url=https%3
Serverless 解惑——函数计算如何访问 PostgreSQL 数据库
![edward-howell-ch0bdm8v4Bc-unsplash.jpg](https://ucc.alicdn.com/pic/developer-ecology/a29cb79fdabb4e0095e819b2b3e4f5b0.jpg) **函数计算(Function Compute)**:[函数计算](https://www.oschina.