Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >爬虫入门经典(十八) | 滑动验证码识别

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

作者头像
不温卜火
发布于 2020-11-12 02:27:23
发布于 2020-11-12 02:27:23
86100
代码可运行
举报
文章被收录于专栏:不温卜火不温卜火
运行总次数:0
代码可运行

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

推荐

  ♥各位如果想要交流的话,可以加下QQ交流群:974178910,里面有各种你想要的学习资料。♥

  ♥欢迎大家关注公众号【不温卜火】,关注公众号即可以提前阅读又可以获取各种干货哦,同时公众号每满1024及1024倍数则会抽奖赠送机械键盘一份+IT书籍1份哟~♥

一、小小课堂

在上篇博文中已经完成了破解文字验证码,接下来我们完成滑动验证码,在此以豆瓣登录验证为例。

滑块验证的步骤,其实上一篇博文已经讲解了,不知道各位同学有没有印象,如果没有也没有关系,下面博主会在此写出步骤:

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

下面我们先来看下豆瓣登录界面

这个时候我们通过输错密码的方法,使其出现验证码。

多滑动和刷新几次,发现一些规律,y轴不变,x轴在变化,豆瓣这个滑动验证码,x轴距离大概207左右,如果需要精确测量,需要使用像素对比。

接来下通过selenium找到滑块,移动就行了,但是有一个问题,如果直接(x1,y1)移动到(x2,y2),相当于瞬移的效果,时间非常短,可能会被对方检测到。

接下来需要使用模拟真实人的点击滑动轨迹,一般是先加速再加速,假设是匀加速和匀减速。 滑动之后,如果不通过,可以刷新按钮,再进行滑动,直到通过(因为通过后一般页面开始跳转title不同或找其他的对比找到不同)

二、模拟匀加速和匀减速

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 密码登录
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//*[@id="account"]/div[2]/div[2]/div/div[1]/ul[1]/li[2]
  • 2.用户账号
  • 3.用户密码
  • 4. 登录豆瓣
  • 5. 找到滑块
  • 刷新按钮

分析完成,下面就开始代码实现了

3.2 代码实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 登录过程测试

四、完整代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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()

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


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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/11/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Tensorflow之 CNN卷积神经网络的MNIST手写数字识别
前言 tensorflow中文社区对官方文档进行了完整翻译。鉴于官方更新不少内容,而现有的翻译基本上都已过时。故本人对更新后文档进行翻译工作,纰漏之处请大家指正。(如需了解其他方面知识,可参阅以下Tensorflow系列文章)。 深入MNIST TensorFlow是一个非常强大的用来做大规模数值计算的库。其所擅长的任务之一就是实现以及训练深度神经网络。在本教程中,通过为MNIST构建一个深度卷积神经网络的分类器,我们将学到构建一个TensorFlow模型的基本步骤。 这个教程假设你已经熟悉神经网络和MNI
用户1332428
2018/03/08
1.6K0
Tensorflow之 CNN卷积神经网络的MNIST手写数字识别
【深度学习】5:CNN卷积神经网络原理
前言:先坦白的说,深度神经网络的学习在一开始对我造成的困扰还是很大的,我也是通过不断地看相关的视频资料、文献讲解尝试去理解记忆。毕竟这些内容大多都是不可查的,我们看到的都只是输入输出的东西,里面的内部运作以及工作原理,都需要沉心静思。
全栈程序员站长
2022/09/13
8230
【深度学习】5:CNN卷积神经网络原理
开发 | 手把手教你用 TensorFlow 实现卷积神经网络(附代码)
AI科技评论按:本文作者徐凯文,原文载于作者个人博客,已获授权。 在知乎上看到一段介绍卷积神经网络的文章,感觉讲的特别直观明了,我整理了一下。首先介绍原理部分。 通过一个图像分类问题介绍卷积神经网络是
AI科技评论
2018/03/13
7680
开发 | 手把手教你用 TensorFlow 实现卷积神经网络(附代码)
基于TensorFlow卷积神经网络与MNIST数据集设计手写数字识别算法
TensorFlow是一个基于Python和基于数据流编程的机器学习框架,由谷歌基于DistBelief进行研发,并在图形分类、音频处理、推荐系统和自然语言处理等场景下有着丰富的应用。2015年11月9日,TensorFlow依据Apache 2.0 开源协议开放源代码。
润森
2022/09/22
7800
基于TensorFlow卷积神经网络与MNIST数据集设计手写数字识别算法
CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]
先给大家出个脑筋急转弯:在白纸上画出一个大熊猫,一共需要几种颜色的画笔?——大家应该都知道,只需要一种黑色的画笔,只需要将大熊猫黑色的地方涂上黑色,一个大熊猫的图像就可以展现出来。
全栈程序员站长
2022/07/01
1.5K0
CNN卷积神经网络原理讲解+图片识别应用(附源码)[通俗易懂]
基于tensorflow实现简单卷积神经网络Lenet5
参考博客:https://blog.csdn.net/u012871279/article/details/78037984 https://blog.csdn.net/u014380165/article/details/77284921 目前人工智能神经网络已经成为非常火的一门技术,今天就用tensorflow来实现神经网络的第一块敲门砖。 首先先分模块解释代码。 1.先导入模块,若没有tensorflow还需去网上下载,这里使用mnist训练集来训练,进行手写数字的识别。 from tensorflo
徐飞机
2018/05/15
1.1K0
TensorFlow实现卷积神经网络
1.卷积神经网络简介 卷积神经网络(convolutional neural network, CNN),最早是19世纪60年代,生物学家对猫视觉皮层研究发现:每个视觉神经元只会处理一小块区域是视觉图像,即感受野。后来到了80年代,日本科学家提出了神经认知机(Neocognitron)的概念,也可以算作是卷积神经网络最初的实现原型,在CS231n的课上说过,卷积神经网络不是一夜产生的,从这个发展过程中我们就可以看出,确实是这样的。卷积神经网络的要点就是局部连接(Local Connection)、权值共
用户1220053
2018/03/29
6330
TensorFlow实现卷积神经网络
TensorFlow实战:CNN构建MNIST识别(Python完整源码)
在文章(TensorFlow实战:SoftMax手写体MNIST识别(Python完整源码))中,我们MNIST手写体识别数据集,使用TensorFlow构建了一个softMAX多分类器,达到了91%的正确率,相比人类98%的识别率,这实在是天糟糕了。为此,本文实现一个稍微复杂的模型:卷积神经网络来改善对MNIST的识别率,这将会达到大概99.2%的准确率。下面让我们一步步的实现该模型,具体的Python源码已上传至我的GitHub:https://github.com/ml365/softmax_mnis
昱良
2018/04/08
2.9K0
tensorflow笔记(五)之MNIST手写识别系列二
http://www.cnblogs.com/fydeblog/p/7455233.html
努力努力再努力F
2018/09/11
3300
tensorflow笔记(五)之MNIST手写识别系列二
一步步提高手写数字的识别率(3)
在前面的两篇文章《一步步提高手写数字的识别率(1)》和《一步步提高手写数字的识别率(2)》中,我们分别介绍了使用Softmax回归和神经网络来实现手写数字识别,其准确率分别在92和98%左右,这在机器学习领域是一个非常不错的准确率,如果我们采用卷积神经网络,准确率还可以进一步提升。
云水木石
2019/07/02
7760
一步步提高手写数字的识别率(3)
译文 | 与TensorFlow的第一次接触 第五章:多层神经网络
本章中,我们继续使用之前章节中的MNIST数字识别问题,与读者一起编码实现一个简单的深度学习神经网络。 如我们所了解的,一个深度学习神经网络由相互叠加的多层组成。特别的,本章中我们会建立一个卷积神经网络---典型的深度学习样例。卷积神经网络由Yann LeCunn及其它人一起在1998年发明并流行起来。这些卷积网络在最近的图像识别中引领了最高性能表现;例如,在这个数字识别的例子中,它就达到了高于99%的精度。 本章的其余部分,我会通过示例代码来讲解神经网络中最重要的两个概念:卷积和池化,关于它们参数的细节超
用户1332428
2018/03/09
6780
译文 | 与TensorFlow的第一次接触 第五章:多层神经网络
第五章(1.5)深度学习——卷积神经网络简介
卷积神经网络(Convolutional Neural Network, CNN)是一种前馈神经网络, 在计算机视觉等领域被广泛应用. 本文将简单介绍其原理并分析Tensorflow官方提供的示例.
两只橙
2019/02/14
7100
第五章(1.5)深度学习——卷积神经网络简介
卷积神经网络(CNN)
假设给定一张图(可能是字母X或者字母O),通过CNN即可识别出是X还是O,如下图所示
CristianoC
2020/05/31
9300
卷积神经网络(CNN)
TensorFlow-手写数字识别(三)
本篇文章在上篇TensorFlow-手写数字识别(二)的基础上,将全连接网络改为LeNet-5卷积神经网络,实现手写数字识别。
xxpcb
2020/08/04
1K0
深入浅出解读卷积神经网络
作者:石文华 编辑:田 旭 卷积神经网络 图1 全连接神经网络结构图 图2 卷积神经网络结构图 卷积神经网络和全连接的神经网络结构上的差异还是比较大的,全连接的网络,相邻两层的节点都有边相连,而卷积神
机器学习算法工程师
2018/03/06
7130
深入浅出解读卷积神经网络
如何使用TensorFlow实现卷积神经网络
编者按:本文节选自图书《TensorFlow实战》第五章,本书将重点从实用的层面,为读者讲解如何使用TensorFlow实现全连接神经网络、卷积神经网络、循环神经网络,乃至Deep Q-Network。同时结合TensorFlow原理,以及深度学习的部分知识,尽可能让读者通过学习本书做出实际项目和成果。 卷积神经网络简介 卷积神经网络(Convolutional Neural Network,CNN)最初是为解决图像识别等问题设计的,当然其现在的应用不仅限于图像和视频,也可用于时间序列信号,比如音频信号
用户1737318
2018/07/20
6570
Tensorflow入门1-CNN网络及MNIST例子讲解
人工智能自从阿尔法狗大败李世石后就异常火爆,最近工作中需要探索AI在移动端的应用,趁着这个计划入门下深度学习吧。
用户3578099
2019/08/16
1.3K0
Python人工智能 | 九.卷积神经网络CNN原理详解及TensorFlow编写CNN
前一篇文章介绍什么是过拟合,并采用droput解决神经网络中过拟合的问题,以TensorFlow和sklearn的load_digits为案例讲解;本篇文章详细讲解了卷积神经网络CNN原理,并通过TensorFlow编写CNN实现了MNIST分类学习案例。本专栏主要结合作者之前的博客、AI经验和"莫烦大神"的视频介绍,后面随着深入会讲解更多的Python人工智能应用。
Eastmount
2021/12/01
8850
Python人工智能 | 九.卷积神经网络CNN原理详解及TensorFlow编写CNN
从锅炉工到AI专家(6)
欠拟合和过拟合 几乎所有的复杂方程都存在结果跟预期差异的情况,越复杂的方程,这种情况就越严重。这里面通常都是算法造成的,当然也存在数据集的个体差异问题。 所以”欠拟合“和”过拟合“是机器学习过程中重
俺踏月色而来
2018/06/20
5180
我深度学习0基础,还训练出一个识别验证码模型!
最近一直没出文,是因为最近在写一个爬虫项目,这个项目里面,碰到了一个比较棘手的事情,那就是验证码。各种方法用尽,最后我还是决定去训练自己的模型,但是,有一个问题---我深度学习可以说是0基础,这可咋弄?想来想去,我只能靠着百度&谷歌两位大佬来写了。
sergiojune
2019/07/12
6900
我深度学习0基础,还训练出一个识别验证码模型!
推荐阅读
相关推荐
Tensorflow之 CNN卷积神经网络的MNIST手写数字识别
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验