精华内容
下载资源
问答
  • python滑块验证码识别

    千次阅读 2019-10-18 10:54:52
    前言 一年之前写的代码,今天用了一下居然还能用,提供一下思路 关于极验 极验之前的滑动验证都是两张图,可以通过截屏获得原图,然后点击获得有缺口的图片,这样就可以对比两张图片获得缺口的位置进行滑动 ...

    前言

    一年之前写的代码,今天用了一下居然还能用,提供一下思路

    关于极验

    极验之前的滑动验证都是两张图,可以通过截屏获得原图,然后点击获得有缺口的图片,这样就可以对比两张图片获得缺口的位置进行滑动
    但是后来原图变了,不在页面上显示了,变成了打乱的图片,如下图
    在这里插入图片描述
    这样获取原图就非常繁琐了,需要去破解算法。

    思路

    我们可以依照之前的思路,看到缺口处的周边都是黑色的阴影,手动获取缺口周边阴影的rgb值
    在这里插入图片描述
    在这里插入图片描述

    上面两张图片是同一条x轴上面的rgb值,可以很明显的看出,缺口地方的值都是在100之内的(你也可以更精细的划分)
    这样该位置的x值就是缺口的位置信息

    代码

    def get_len():
        """获取缺口的位置信息"""
        im = Image.open("./jy.png")
    
        # print(im.size)
        chang = 0
        for x in range(im.size[0]):
            a = 0
            for y in range(im.size[1]):
    
                rgb = im.load()[x, y]
                # print(x,y,rgb)
                # if rgb[0] < 20 and rgb[1] > 40 and rgb[1] < 55 and rgb[2] > 54 and rgb[2] < 90:
                if rgb[0] < 20 and rgb[1] < 60 and rgb[2] < 90:
                    # print("进来了")
                    # print(x,y)
                    a += 1
    
                if a >= 10:
                    print(x)
                    return x
        return chang
    

    小结

    虽然这个方式看起来有点low,也存在一定的误差,但还是可以滑过去的。
    结果:一般极验是五张图片就需要重新刷新,35次实验中中五张之内通过的有33次,1张通过的有15次,其余大部分都是2张或者3张,总体来说效果还可以。

    展开全文
  • 主要给大家介绍了关于python验证码识别教程之滑动验证码的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 破解滑块验证码的思路主要有2种: 获得一张完整的背景图和一张有缺口的图片,两张图片进行像素上的一一对比,找出不一样的坐标。 获得一张有缺口的图片和需要验证的小图,两张图片进行二极化以及归一化,确定小图...
  • 文章来源:python干货铺子❞前言验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、行为验证等。随着OCR技术的成熟,图片验证已经渐渐淡出主流,而「滑块验证」越来越多地...

    文章来源:python干货铺子

    前言

    验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、行为验证等。随着OCR技术的成熟,图片验证已经渐渐淡出主流,而「滑块验证」越来越多地出现在大众视野。“这么厉害,这小子长啥样呢?”没错,它就长这损sai:解决它的方法也很直观,首先找到缺口的位置(通常只需要X轴的位置),然后拖动滑块即可。今天kimol君将带领大家用python识别出滑块验证中的缺口位置。

    一、缺口识别

    识别图片中的缺口,主要是利用python中的图像处理库cv2,其安装方法如下:

    pip install opencv-python

    注:这里并不是“pip install cv2”哦~

    1.读取图片

    滑块验证的图片分为两部分,一个是背景图片:

    72d4d0a7419b6c859d554af9ba253f91.png另一个是缺口图片:

    8728c598e7ab7c65ebc5cf64fdb9ad6f.png利用imread函数将其读取:

    # 读取背景图片和缺口图片

    bg_img = cv2.imread('bg.jpg') # 背景图片

    tp_img = cv2.imread('tp.png') # 缺口图片

    2.识别图片边缘

    为了更好地将缺口与背景匹配,我们首先得识别出图片的边缘:

    # 识别图片边缘

    bg_edge = cv2.Canny(bg_img, 100, 200)

    tp_edge = cv2.Canny(tp_img, 100, 200)

    这一步很关键!否则缺口匹配将不准确。

    这里得到了图片边缘的灰度图,进一步将其图片格式转为RGB格式:

    # 转换图片格式

    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)

    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)

    转换后的背景图为:

    a703fde2cbe27284a0c49ae97de676f5.png转换后的缺口图为:

    c849e16d9e7db35a7e9b16dd8ae9c683.png

    3.缺口匹配

    利用cv2中的matchTemplate函数,可以在背景图片中搜索对应的缺口,具体代码如下:

    # 缺口匹配

    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)

    res为每个位置的匹配结果,代表了匹配的概率,选出其中「概率最高」的点,即为缺口匹配的位置:

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配

    min_val,max_val,min_loc,max_loc分别为匹配的最小值、匹配的最大值、最小值的位置、最大值的位置。ps.当然,这里完全可以自己写一个循环来实现,但是有现成的函数为什么不用呢?

    至此,我们已经有了缺口的位置,其X轴坐标为:

    X = max_loc[0]

    为了更直观地展示缺口的位置,我们将缺口用矩形框标注出来:

    # 绘制方框

    th, tw = tp_pic.shape[:2]

    tl = max_loc # 左上角点的坐标

    br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标

    cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形

    cv2.imwrite('out.jpg', bg_img) # 保存在本地

    结果如下:完美~ 收工!!!

    二、完整代码

    为了在实际应用中更方便的使用,我们将代码封装为一个函数:

    def identify_gap(bg,tp,out):

    '''

    bg: 背景图片

    tp: 缺口图片

    out:输出图片

    '''

    # 读取背景图片和缺口图片

    bg_img = cv2.imread(bg) # 背景图片

    tp_img = cv2.imread(tp) # 缺口图片

    # 识别图片边缘

    bg_edge = cv2.Canny(bg_img, 100, 200)

    tp_edge = cv2.Canny(tp_img, 100, 200)

    # 转换图片格式

    bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)

    tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)

    # 缺口匹配

    res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配

    # 绘制方框

    th, tw = tp_pic.shape[:2]

    tl = max_loc # 左上角点的坐标

    br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标

    cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形

    cv2.imwrite(out, bg_img) # 保存在本地

    # 返回缺口的X坐标

    return tl[0]

    这里选择了读取本地图片文件,在爬虫过程中其实不是特别方便。如果有感兴趣的小伙伴,可以自己改动一下,将输入改为图片流即可。

    写在最后

    本文至此便告于段落了,如果需要完整源码或者有任何建议都欢迎私信。最后,感谢各位小伙伴的耐心阅读,咋们下次再会~

    寻找不易,大侠请留步… 动起可爱的双手,来个赞再走呗 (๑◕ܫ←๑)

    展开全文
  • Python Selenium 网络爬虫工具,解决滑块验证码
  • Python实现验证码识别

    2020-12-17 09:44:40
    python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类:  1、计算验证码  2、滑块验证码  3、识图验证码  4、语音验证码  这篇博客主要写的就是识图验证码,识别的是...
  • Python 滑块验证码

    千次阅读 2020-12-08 21:14:35
    正文[1]流程利用 Python selenium 自动化测试工具 直接拟人行为来完成滑块验证码验证分析页面,找出滑块验证码的完整图片,缺口图片。对比原始的图片和带缺口的图片的像素,像素不同的地方就是缺...

    image

    看了滑块验证码(滑动验证码)相比图形验证码,破解难度如何?中《Python3网络爬虫开发实战》作者 崔庆才丨静觅 的一个回答,里面有详细介绍如何对抗滑块验证码,因此学习一下,对此进行记录。

    正文

    [1]流程

    利用 Python selenium 自动化测试工具 直接拟人行为来完成滑块验证码验证

    分析页面,找出滑块验证码的完整图片,缺口图片。

    对比原始的图片和带缺口的图片的像素,像素不同的地方就是缺口位置

    计算出滑块缺口的位置,得到所需要滑动的偏移量

    使用物理加速度位移公式计算出移动轨迹

    最后利用 Selenium 进行对滑块的拖拽

    image

    [2]分析页面

    B站,是一个不错的学习网站

    image

    ,记得很久之前第一次碰到滑块验证码登录时候就是在B站看见的,所以拿它来练手。:smiley:

    F12,打开开发者工具,找出登录框中有用的信息。

    用户名输入: id="login-username"

    密码输入框: id="login-passwd"

    登录按钮: class="btn btn-login"

    带有缺口的验证码图片: class="geetest_canvas_bg geetest_absolute"

    需要滑动的验证码图片: class="geetest_canvas_slice geetest_absolute"

    完整的验证码图片: class="geetest_canvas_fullbg geetest_fade geetest_absolute"

    滑块按钮: class="geetest_slider_button"

    [3]编写代码

    导入库文件

    from selenium import webdriver

    from selenium.webdriver.chrome.options import Options

    from selenium.webdriver.support.wait import WebDriverWait

    from selenium.webdriver.support import expected_conditions as EC

    from selenium.webdriver.common.by import By

    from selenium.webdriver import ActionChains

    import time

    import random

    from PIL import Image

    USER_AGENT_LIST

    USER_AGENT_LIST = [

    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",

    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36",

    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",

    "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36",

    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",

    "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",

    "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",

    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",

    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",

    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",

    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",

    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",

    "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",

    "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",

    "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",

    "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",

    "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",

    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",

    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",

    "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",

    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",

    "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",

    "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",

    ]

    初始化函数

    def init(self):

    """

    初始化变量

    :return:

    """

    global url, browser, username, password, wait

    url = 'https://passport.bilibili.com/login'

    path = r'G:\Python3\Scripts\chromedriver.exe'

    chrome_options = Options()

    #随机选择一个User_Agent

    user_agent = random.choice(USER_AGENT_LIST)

    #全屏

    chrome_options.add_argument('--start-maximized')

    chrome_options.add_argument('user-agent=%s'%user_agent)

    #开启开发者模式,可以进一步防止selenium被反爬虫识别

    chrome_options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors","enable-automation"])

    browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)

    username = '用户名'

    password = '密码'

    wait = WebDriverWait(browser, 20)

    global 关键字 定义了 url, browser, username, password, wait等全局变量,随后定义了chrome 的路径。

    登录函数

    def login(self):

    """

    输入帐号密码登录

    :return:

    """

    browser.get(url)

    user = wait.until(EC.presence_of_element_located((By.ID,'login-username')))

    passwd = wait.until(EC.presence_of_element_located((By.ID,'login-passwd')))

    user.send_keys(username)

    passwd.send_keys(password)

    #contains 就是包含,根据上面分析得知,登录按钮是的class是 btn btn-login 所以用XPATH 的contains函数就可以只选择其中之一。

    login_btn = wait.until(EC.presence_of_element_located((By.XPATH,"//a[contains(@class,'btn-login')]")))

    ran_time = random.random() * 2

    print("随机睡眠时间: ",ran_time)

    time.sleep(ran_time)

    login_btn.click()

    等待用户名输入框和密码输入框对应的 ID 节点加载出来

    获取这两个节点,用户名输入框 id="login-username",密码输入框 id="login-passwd"

    调用 send_keys() 方法输入用户名和密码

    获取登录按钮 class="btn btn-login"

    随机产生一个数并将其扩大两倍作为暂停时间

    最后调用 click() 方法实现登录按钮的点击

    【4】验证码处理模块

    验证码元素查找函数

    def find_code(self):

    """

    查找 验证码图片

    :return:

    """

    #带有缺口的图片

    code_bg = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_bg.geetest_absolute'))

    )

    #需要滑动的图片

    code_slice = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_slice.geetest_absolute'))

    )

    #完整的图片

    code_fullbg = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute'))

    )

    #隐藏验证码

    self.hide_element(code_slice)

    #保存带有缺口的验证码图片

    self.save_screenshot(code_bg,'bg')

    #显示需要滑动的验证码图片

    self.show_element(code_slice)

    #保存需要滑动的验证码图片

    self.save_screenshot(code_slice,"slice")

    #显示完整验证码图片

    self.show_element(code_fullbg)

    #保存完整验证码图片

    self.save_screenshot(code_fullbg,"full")

    获取验证码的三张图片,分别是完整的图片、带有缺口的图片和需要滑动的图片

    分析页面代码,三张图片是由 3 个 canvas 组成,3 个 canvas 元素包含 CSS display 属性,display:block 为可见,display:none 为不可见,在分别获取三张图片时要将其他两张图片设置为 display:none,这样做才能单独提取到每张图片

    定位三张图片的 class 分别为:带有缺口的图片(code_bg):geetest_canvas_bg geetest_absolute、需要滑动的图片(code_slice):geetest_canvas_slice geetest_absolute、完整图片(code_fullbg):geetest_canvas_fullbg geetest_fade geetest_absolute

    最后传值给 save_screenshot() 函数,进一步对验证码进行处理

    image

    隐藏展示函数

    def hide_element(self,element):

    """

    隐藏属性

    :return:

    """

    browser.execute_script("arguments[0].style=arguments[1]",element,"display:none;")

    def show_element(self,element):

    """

    显示属性

    :return:

    """

    browser.execute_script("arguments[0].style=arguments[1]",element,"display:block;")

    设置元素可见,或隐藏功能。

    网页截图函数

    def save_screenshot(self,obj,name):

    """

    网页截图,获取验证码图片

    :param name:图片名字

    :return:截图对象

    """

    #obj 需要 截图的 位置 name 文件名称

    try:

    #save_screenshot 对整个网页进行截图

    pic_url = browser.save_screenshot('./bilibili.png')

    print("%s截图成功"%pic_url)

    left,top,right,bottom = obj.location['x'],obj.location['y'],obj.location['x'] + obj.size['width'],obj.location['y'] + obj.size['height']

    print('图:' + name)

    print('Left %s' % left)

    print('Top %s' % top)

    print('Right %s' % right)

    print('Bottom %s' % bottom)

    print('')

    # 在整个页面截图的基础上,根据位置信息,分别剪裁出三张验证码图片并保存

    im = Image.open('./bilibili.png')

    im = im.crop((left, top, right, bottom)) #对浏览器截图进行裁剪

    file_name = 'bili_' + name + '.png'

    im.save(file_name)

    except BaseException as msg:

    print("%s:截图失败"%msg)

    save_screenshot方法把网页截图保存为bilibili.png图片,

    obj为三张验证码图片对象,获取图片的x,y,宽,高,

    接着打开网页的截图,通过三张验证码图片的坐标,

    调用crop()方法将其裁剪出来,在进行保存。

    【5】验证码滑动模块

    滑动模块主函数

    def slide(self):

    """

    :return:

    """

    distance = self.get_distance(Image.open('./bili_back.png'),Image.open('./bili_full.png'))

    print('计算偏移量:%s Px'% distance)

    trace = self.get_trace(distance - 5)

    self.move_to_gap(trace)

    time.sleep(3)

    向get_distance方法传入缺口图片和完整图片,计算滑块偏移量

    distance通过 get_distance方法返回值,获取验证码缺口偏移量

    在把偏移量传入 get_trace方法中,通过物理加速度位移公式,构造出滑块的移动轨迹。 distance -5是减去滑块缺口偏移

    在把传回来的值传入move_to_gap方法实现拟人操作。

    获取缺口偏移量

    def get_distance(self,bg_image,fullbg_image):

    """

    获取缺口偏移量

    :param bg_image:带缺口图片

    :param fullbg_image:不带缺口图片

    :return:

    """

    #坐标设为60起始位置

    distance = 60

    for i in range(distance,fullbg_image.size[0]):

    for j in range(fullbg_image.size[1]):

    if not self.is_pixel_equal(fullbg_image,bg_image,i,j):

    distance = i

    return distance

    return distance

    def is_pixel_equal(self,bg_image,fullbg_image,x,y):

    """

    判断两个像素是否相同

    :param bg_image:带缺口图片

    :param fullbg_image:不带缺口图片

    :param x:位置x

    :param y:位置y

    :return:像素是否相同

    """

    #获得两章图片对应像素点的RGB数据

    bg_pixel = bg_image.load()[x,y]

    fullbg_pixel = fullbg_image.load()[x,y]

    #设定一个阈值,像素也许存在误差, 60作为容差范围

    threshold = 60

    #比较两张图 RGB 的 绝对值是否小于定义的阈值

    for i in range(0,3):

    if (abs(bg_pixel[i] - fullbg_pixel[i]

    return True

    # if (abs(bg_pixel[0] - fullbg_pixel[0] < threshold)and abs(bg_pixel[1] - fullbg_pixel[1]

    #return True

    return False

    get_distance方法获取缺口偏移量,就是获取缺口位置,此方法的两个参数为两张图片,一张为带缺口图片,一张为完整图片,在这里遍历两张图片的每个像素,然后利用is_pixel_equal方法判断两张图片同一位置的像素是否相同,比对时候,比较了两张图片的RGB的绝对值是否均小于阈值threshold,如果均在阈值之内,则像素点相同,继续遍历,否则遇到不相同的像素点就是缺口的位置。

    需要滑动的图片:

    image

    完整的图片:

    image

    通过观察,其实可以发现,滑块位置会出现在图片左边位置,缺口的位置通常处于图片的右边位置,缺口和滑块会处于同一水平线上,所以要寻找缺口的话,直接从右侧开始寻找即可,所以在遍历开始时候,直接设置了遍历的起始坐标为distance 60,也就是从滑块的右侧开始识别。

    模拟拖动

    多次试验发现,模拟拖动这个操作不难,但是按照实际操作来说,人为拖动这个模块,是无法做到完全匀速拖动。

    人手会因为距离的变短而减慢速度确认位置,可能会出现抖动,往回拖拉等操作,所以如果出现匀速操作,就会被识别出是程序在操作,检测机制会根据其机器学习模型筛选出此类数据,归类为机器操作,就会出现该图片被怪兽吃掉的情况。

    要让程序根据距离长短,来为其加速或者减速操作,可以利用物理学的加速度位移公式来完成:

    用Python 来表示就是:

    #运用物理加速度位移相关公式 X=v0 * t+ 1/2 * a * t*t

    #a 加速度 X 位移 v0 初速度

    X = v0 * t +1/2 * a * t * t

    #当前时刻的速度

    v = v0 + a * t

    运用这两个公式可以构造一个轨迹移动算法,计算出先加速后减速的运动轨迹:

    #模拟人工拉动滑块

    def get_trace(self,distance):

    """

    根据偏移量获取移动轨迹

    :param distance:偏移量

    :return:滑动轨迹

    """

    trace = []

    # 设置加速距离为总距离的 4 /5

    mid = distance * (4 / 5)

    #设置当前位移 , 初始速度、时间间隔

    current,v0 ,t = 0,0,0.1

    while current< distance:

    if current< mid:

    #加速度为正10

    a =10

    else:

    #减速度为负10

    a = -10

    #运用物理加速度位移相关公式 X=v0 * t+ 1/2 * a * t*t

    #a 加速度 X 位移 v0 初速度

    X = v0 * t +1/2 * a * t * t

    #当前时刻的速度

    v = v0 + a * t

    v0 =v

    current +=X

    #记录每个时间间隔移动的多少位移

    trace.append(round(X))

    return trace

    get_trace() 方法传入的参数为移动的总距离,返回的是运动轨迹,用 trace 表示,它是一个列表,列表的每个元素代表每次移动多少距离。

    定义了一个变量mid,用来控制减速的阈值,既模拟前 4/5的路程是加速路程,后1/5是减速路程,但是如果偏移量过大时候,会被检测出,可能是前面4/5的路程过于匀速。所以可以设置为 7/8.

    在定义当前位移 current,初始为0,随后进入while循环,循环条件是当前位移小于偏移量,在循环里分段定义了加速度,其中加速过程加速度定义为10,减速度定义为负10,随后再套用物理学加速位移公式算出某个时间段内的位移,同时将该位移更新并记录到轨迹trace里。

    当达到总距离时既停止循环,最后得到的trace既记录了每个时间间隔移动了多少位移,这样滑块的运动轨迹就得到了。

    然后在按照该运动轨迹传入move_to_gap方法实现拖动模块

    def move_to_gap(self,trace):

    """

    拖动滑块到缺口处

    :param trace:轨迹

    :return:

    """

    slider = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.geetest_slider_button')))

    ActionChains(browser).click_and_hold(slider).perform()

    for x in trace:

    ActionChains(browser).move_by_offset(xoffset=x,yoffset=0).perform()

    time.sleep(0.5)

    ActionChains(browser).release().perform()

    在这里传入的参数为运动轨迹

    定义了slider获取滑块对象

    调用ActionChains的 click_and_hold方法按住拖动底部滑块,随后遍历运动轨迹获取每小段位移距离

    在调用move_by_offset方法移动此位移,最后移动完成之后调用release方法松开鼠标。

    【6】完整代码

    # =============================================

    # -*- coding: utf-8 -*-

    # @Time : 2020-02-06

    # @Author : KeyboArd

    # @Blog : www.wrpzkb.cn

    # @FileName: bilibili_login.py

    # @Software: PyCharm

    # =============================================

    from selenium import webdriver

    from selenium.webdriver.chrome.options import Options

    from selenium.webdriver.support.wait import WebDriverWait

    from selenium.webdriver.support import expected_conditions as EC

    from selenium.webdriver.common.by import By

    from selenium.webdriver import ActionChains

    import time

    import random

    from PIL import Image

    USER_AGENT_LIST = [

    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",

    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36",

    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",

    "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.3319.102 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2309.372 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.2117.157 Safari/537.36",

    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1866.237 Safari/537.36",

    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F",

    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36 Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",

    "Opera/9.80 (X11; Linux i686; Ubuntu/14.10) Presto/2.12.388 Version/12.16",

    "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",

    "Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",

    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0) Opera 12.14",

    "Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",

    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",

    "Opera/9.80 (Windows NT 5.1; U; zh-sg) Presto/2.9.181 Version/12.00",

    "Opera/12.0(Windows NT 5.2;U;en)Presto/22.9.168 Version/12.00",

    "Opera/12.0(Windows NT 5.1;U;en)Presto/22.9.168 Version/12.00",

    "Mozilla/5.0 (Windows NT 5.1) Gecko/20100101 Firefox/14.0 Opera/12.0",

    "Opera/9.80 (Windows NT 6.1; WOW64; U; pt) Presto/2.10.229 Version/11.62",

    "Opera/9.80 (Windows NT 6.0; U; pl) Presto/2.10.229 Version/11.62",

    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",

    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; de) Presto/2.9.168 Version/11.52",

    "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.9.168 Version/11.51",

    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; de) Opera 11.51",

    "Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50",

    "Opera/9.80 (X11; Linux i686; U; hu) Presto/2.9.168 Version/11.50",

    ]

    class bilibili_code():

    def init(self):

    """

    初始化变量

    :return:

    """

    global url, browser, username, password, wait

    url = 'https://passport.bilibili.com/login'

    path = r'G:\Python3\Scripts\chromedriver.exe'

    chrome_options = Options()

    user_agent = random.choice(USER_AGENT_LIST)

    #全屏

    chrome_options.add_argument('--start-maximized')

    chrome_options.add_argument('user-agent=%s'%user_agent)

    # chrome_options.add_argument(user_agent)

    chrome_options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors","enable-automation"])

    browser = webdriver.Chrome(executable_path=path, chrome_options=chrome_options)

    username = '用户名'

    password = '密码'

    wait = WebDriverWait(browser, 20)

    def login(self):

    """

    输入帐号密码登录

    :return:

    """

    browser.get(url)

    user = wait.until(EC.presence_of_element_located((By.ID,'login-username')))

    passwd = wait.until(EC.presence_of_element_located((By.ID,'login-passwd')))

    user.send_keys(username)

    passwd.send_keys(password)

    login_btn = wait.until(EC.presence_of_element_located((By.XPATH,"//a[contains(@class,'btn-login')]")))

    ran_time = random.random() * 2

    print("随机睡眠时间: ",ran_time)

    time.sleep(ran_time)

    login_btn.click()

    def find_code(self):

    """

    查找 验证码图片

    :return:

    """

    #带有缺口的图片

    code_bg = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_bg.geetest_absolute'))

    )

    #需要滑动的图片

    code_slice = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_slice.geetest_absolute'))

    )

    #完整的图片

    code_fullbg = wait.until(

    EC.presence_of_element_located((By.CSS_SELECTOR,'canvas.geetest_canvas_fullbg.geetest_fade.geetest_absolute'))

    )

    #隐藏验证码

    self.hide_element(code_slice)

    #保存带有缺口的验证码图片

    self.save_screenshot(code_bg,'bg')

    #显示需要滑动的验证码图片

    self.show_element(code_slice)

    #保存需要滑动的验证码图片

    self.save_screenshot(code_slice,"slice")

    #显示完整验证码图片

    self.show_element(code_fullbg)

    #保存完整验证码图片

    self.save_screenshot(code_fullbg,"full")

    def hide_element(self,element):

    """

    隐藏属性

    :return:

    """

    browser.execute_script("arguments[0].style=arguments[1]",element,"display:none;")

    def show_element(self,element):

    """

    显示属性

    :return:

    """

    browser.execute_script("arguments[0].style=arguments[1]",element,"display:block;")

    def save_screenshot(self,obj,name):

    """

    网页截图,获取验证码图片

    :param name:图片名字

    :return:截图对象

    """

    #obj 需要 截图的 位置 name 文件名称

    try:

    #save_screenshot 对整个网页进行截图

    pic_url = browser.save_screenshot('./bilibili.png')

    print("%s截图成功"%pic_url)

    left,top,right,bottom = obj.location['x'],obj.location['y'],obj.location['x'] + obj.size['width'],obj.location['y'] + obj.size['height']

    print('图:' + name)

    print('Left %s' % left)

    print('Top %s' % top)

    print('Right %s' % right)

    print('Bottom %s' % bottom)

    print('')

    # 在整个页面截图的基础上,根据位置信息,分别剪裁出三张验证码图片并保存

    im = Image.open('./bilibili.png')

    im = im.crop((left, top, right, bottom)) #对浏览器截图进行裁剪

    file_name = 'bili_' + name + '.png'

    im.save(file_name)

    except BaseException as msg:

    print("%s:截图失败"%msg)

    def slide(self):

    """

    :return:

    """

    distance = self.get_distance(Image.open('./bili_back.png'),Image.open('./bili_full.png'))

    print('计算偏移量:%s Px'% distance)

    trace = self.get_trace(distance - 5)

    self.move_to_gap(trace)

    time.sleep(3)

    def get_distance(self,bg_image,fullbg_image):

    """

    获取缺口偏移量

    :param bg_image:带缺口图片

    :param fullbg_image:不带缺口图片

    :return:

    """

    distance = 60

    for i in range(distance,fullbg_image.size[0]):

    for j in range(fullbg_image.size[1]):

    if not self.is_pixel_equal(fullbg_image,bg_image,i,j):

    distance = i

    return distance

    return distance

    def is_pixel_equal(self,bg_image,fullbg_image,x,y):

    """

    判断两个像素是否相同

    :param bg_image:带缺口图片

    :param fullbg_image:不带缺口图片

    :param x:位置x

    :param y:位置y

    :return:像素是否相同

    """

    #获得两章图片对应像素点的RGB数据

    bg_pixel = bg_image.load()[x,y]

    fullbg_pixel = fullbg_image.load()[x,y]

    #设定一个阈值,像素也许存在误差, 60作为容差范围

    threshold = 60

    #比较两张图 RGB 的 绝对值是否小于定义的阈值

    for i in range(0,3):

    if (abs(bg_pixel[i] - fullbg_pixel[i]

    return True

    # if (abs(bg_pixel[0] - fullbg_pixel[0] < threshold)and abs(bg_pixel[1] - fullbg_pixel[1]

    #return True

    return False

    #模拟人工拉动滑块

    def get_trace(self,distance):

    """

    根据偏移量获取移动轨迹

    :param distance:偏移量

    :return:滑动轨迹

    """

    trace = []

    # 设置加速距离为总距离的 4 /5

    mid = distance * (4 / 5)

    #设置当前位移, 初始速度、时间间隔

    current,v0 ,t = 0,0,0.1

    while current< distance:

    if current< mid:

    #加速度为正10

    a =10

    else:

    #减速度为负10

    a = -10

    #运用物理加速度位移相关公式 X=v0 * t+ 1/2 * a * t*t

    #a 加速度 X 位移 v0 初速度

    X = v0 * t +1/2 * a * t * t

    #当前时刻的速度

    v = v0 + a * t

    v0 =v

    current +=X

    #记录每个时间间隔移动的多少位移

    trace.append(round(X))

    return trace

    def move_to_gap(self,trace):

    """

    拖动滑块到缺口处

    :param trace:轨迹

    :return:

    """

    slider = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'div.geetest_slider_button')))

    ActionChains(browser).click_and_hold(slider).perform()

    for x in trace:

    ActionChains(browser).move_by_offset(xoffset=x,yoffset=0).perform()

    time.sleep(0.5)

    ActionChains(browser).release().perform()

    def crack(self):

    self.init()

    self.login()

    self.find_code()

    self.slide()

    success = browser.current_url

    if success == "https://www.bilibili.com/":

    print("登录成功")

    browser.close()

    else:

    self.crack()

    if __name__ == '__main__':

    bi = bilibili_code()

    bi.crack()

    【7】效果实现动画

    image

    展开全文
  • 主要介绍了Python破解BiliBili滑块验证码的思路,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • SliderYolo是采用百度飞桨PPYolo训练而来,可以识别易盾,云片,极验,腾讯等各种正方形滑块识别率99.9999%! 滑块识别交流 使用方式 下载整个项目,然后解压__params__.zip文件,将解压出来的__params__文件放在...
  • Python解决滑块验证码

    千次阅读 2020-08-04 13:49:34
    验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是"滑动拼图式" ...

    1 abstract

    验证码作为一种自然人的机器人的判别工具,被广泛的用于各种防止程序做自动化的场景中。传统的字符型验证安全性已经名存实亡的情况下,各种新型的验证码如雨后春笋般涌现。目前最常见的一种形式就是"滑动拼图式"

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    2 内容概述

    关于滑动式验证,最早由国内某网络安全公司首次提出的行为式验证,以滑动拼图解锁的方式呈现在世人面前。然后大概过了好几年之后,各种各样的滑动式验证产品都出来了,那么这些看似一样的产品,它们的安全性到底如何呢?

    本文特意挑选出了一些后来者的小厂商的滑动式验证来做下实验,仅从第一步的图像学上分析一下安全性。因为我的主技术路线是图像学,关于前端的js并不熟悉,所以就只在图像学上点到即止即可。仅供会一些自动化技术的同学提供一些知识补充吧。

    由于研究的实验对象实在是太简单,所以本文涉及的一些图像学的知识也不难,基本上python的初级选手就可以跑通本程序。仅供大家学习学习。

    3 研究对象

    某小站点上由小厂商提供的"滑动式验证":

    使用python写一个简单的爬虫自动化脚本,将此网站上的验证码资源多请求几次,并保存到本地,观查图片特点。

    一般情况下,这一步是必须的,多下载一些图片,很多规律是可以一眼看出的。比如,从公开的页面中,连续请求此验证的资源 100次,下载100张图片后。

    一眼看上去,此验证的图片素材都只有一种模式,那么就放心了,因为这个问题就比较单一,而不是多模式下你必须要解决多个问题。

    4 定性分析

    将这种单一模式的图片筛选一张出来,如下:

    发现如下特点:

    和前端展示相关的图片有:方块位置提示图A,小方块B,完整背景图C。

    A图完全是由B和C合成

    显然,设计这个验证图片的人没啥安全方面的经验,有如下两个产品细节没有注意:

    对图片没做任何的特殊处理

    对外公开提供了过多信息

    于是使得识别此图片的位置变得极其简单。

    5 定量分析

    在前面一小节中,我们只是直观的看到了这些图片的一些特别,但是要解答这个题目,还需要进行量化,量化后才能程序化,程序化后才能全自动化。

    使用matplotlib工具打开此图片。量化得到如下参数:

    图片整体规格:w:240,h:450

    由上到下分为三部分,每部分高度为150

    6 求解图片

    很明显,只要将第一张图和第三张图相应的像素相减,神奇的事情就发生了:

    "左上" 减去 "右下" 就得到 "左下"的结果。

    这个时候,对x方向的R通道的像素点进行累加统计。

    得到如下的统计图:

    然后对这个曲线求一阶导数或者只要发现有个突变值超过最大像素值的某百分比时,即可得到最左边的那个y方向突变点的位置。

    到此为止,此图片的位置已经成功解出。

    下面是相应的python代码:

     
    1. import numpy as np

    2. ...

    3. def get_boundary(mask, axis, ratio=0.6):

    4. """

    5. 对ç°åº¦å¾çæ个channelååç´ ç»è®¡

    6. """

    7. sum_along_axis = np.sum(mask, axis=axis)

    8. max_value = np.max(sum_along_axis)

    9. bound_value = max_value * ratio

    10. bvalue = (sum_along_axis >= bound_value).astype('int8')

    11. return np.where(bvalue != 0)[0][0]

    12. def get_predict_ans(img):

    13. """

    14. æ ¹æ®åç±»åºæ¥çå¾åï¼æ¾å°ç¸åºçå¾åä½ç½®

    15. ä¼ å¥äºè¿å¶çå¾çï¼è¿åç­æ¡

    16. :param img:

    17. :return:

    18. """

    19. nd_img = np.array(img)

    20. w_pos = get_boundary(nd_img, 0) # æ ¹æ®åå¸å¾æ¾å°è¾¹çä½ç½®

    21. return w_pos

    总结

    以上所述是小编给大家介绍的Python实现图片滑动式验证识别方法,希望对大家有所帮助!

    展开全文
  • 下面一段代码给大家介绍python破解geetest 验证码功能,具体代码如下所示: from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.action_...
  • ###在UI自动化测试或者做爬虫的过程中,难免会碰到滑块验证码的场景,故此将自己本次遇到的情况与解决思路记录一下 ##1.缺口图片下载 目前所用的自动化框架是基于java写的,所以下载该缺口图片的代码也是java代码,...
  • Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login python3 pip install selenium (webdriver框架) pip install PIL (图片处理) chrome ...
  • Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login python3 pip install selenium (webdriver框架) pip install PIL (图片处理) chrome ...
  • python 滑块验证码破解之获取缺口位置 Python环境搭建OpenCV 适用于windows pip install –upgrade setuptools pip install numpy Matplotlib pip install opencv-python import cv2 import numpy as np ...
  • 通过该验证码识别动作为:点击并拖拽滑块- 滑动滑块至缺口处-释放鼠标 该验证码增加了机器学习来识别拖动的轨迹,即:人不可能实现匀速拖拽 所以为解决被识别出为非人为拖拽,则控制拖拽的速度,一般人的拖拽为...
  • Python破解BiliBili滑块验证码,完美避开人机识别,可以有 准备工作 B站登录页 https://passport.bilibili.com/login python3 pip install selenium (webdriver框架) pip install PIL (图片处理) chrome driver...
  • 滑块验证码识别

    2020-09-18 16:40:00
    本文是使用极验滑动验证码的官网做的实验,没有账号的可以先注册一个账号 ,地址 :https://account.geetest.com/login 安装环境 chromedriver 下载地址 可以根据自己chrome版本和系统自行下载地址:...
  • 本节我们的目标是用程序来识别并通过极验验证码的验证,其步骤有分析识别思路、识别缺口位置、生成滑块拖动路径,最后模拟实现滑块拼合通过验证。 2. 准备工作 本次我们使用的 Python 库是 Selenium,使用的浏览器为...
  • 主要为大家详细介绍了python爬虫之自动登录与验证码识别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 简单的图形验证码我们可以直接利用 Tesserocr 来识别,但是近几年又出现了一些新型验证码,如滑动验证码,比较有代表性的就是极验验证码,它需要拖动拼合滑块才可以完成验证,相对图形验证码来说识别难度上升了几个...
  • 腾讯滑块验证码识别 腾讯滑块验证码识别,识别凹槽的x轴位置,mock滑块的加速度。该项目公开API,提供识别和加速度模拟部分,第二部分模拟滑动进行识别返回数据请求 项目地址: 原文地址: 参考项目: 安装python环境...
  • 1、介绍在爬虫中经常会遇到验证码识别的问题,现在的验证码大多分计算验证码、滑块验证码、识图验证码、语音验证码等四种。本文就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很...
  • 大致介绍在python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类:1、计算验证码2、滑块验证码3、识图验证码4、语音验证码这篇博客主要写的就是识图验证码,识别的是简单的...
  • python爬虫爬取某些网站的验证码的时候可能会遇到验证码识别的问题,现在的验证码大多分为四类: 1、计算验证码 2、滑块验证码 3、识图验证码 4、语音验证码 学长这李主要写的就是识图验证码,识别的是...
  • 在本篇内容里小编给大家分享的是关于Python3爬虫中识别图形验证码的实例讲解内容,需要的朋友们可以学习参考下。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,122
精华内容 448
关键字:

python滑块验证码识别

python 订阅