selenium爬虫|破解滑动验证码以极验为例

这篇具有很好参考价值的文章主要介绍了selenium爬虫|破解滑动验证码以极验为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

move_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,jsmove_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,jsmove_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,js

 move_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,jsmove_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,jsmove_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,js

爬虫访问一些网站遇到滑动验证码解决方案

这里是用selenium做模拟,如果是requests可以封装这个登录方法来获取登录后的cookies也是可以用的。

1

思路

先讲思路,分析流程 

我们输入账号密码后点击登录 ,出现的是第一张图的状态。我们要做的是模拟滑动到缺口处。

  • 首先我们要拿到第二张(有缺口)  的图片 再拿到第三张(无缺口)的图片
  • 然后我们通过对比两张图片的像素,找到不一样的那个像素的x轴的位置
  • 最后调用selenium模拟滑动到缺口处,实现登录

获取图片

分析网站

解决第一个问题:获取图片,chrome浏览器F12定位到图片,可以看到是canvas画板

move_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,js

一共有三个canvas,classname分别是geetest_canvas_bg、geetest_canvas_slice、geetest_canvas_fullbg。看名字也大概能知道分别是什么。我们尝试将geetest_canvas_slice的css属性透明的设置为0看看。可以再旁边直接写css也可以console里面写js语句,因为到时候用selenium需要执行js语句来实现,所以我们运行一下js语句

ok,可以获得有缺口的图片,在吧下面的一个canvas设置一下display:block,获得背景图

move_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,jsmove_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,js

 代码 

全程代码都默认你们都会selenium打开网站等操作和python编程基础,然后这里执行几个js分别截图获取滑动图片和背景图片

   b.get(url)
    # b.refresh()

    # b.implicitly_wait(25)
    # b.find_element_by_xpath('//*[@id="login"]/div/div/ul/li[2]/input').click()
    img1 = '1.jpeg'
    img2 = '2.png'
    b.find_element_by_xpath('//*[@id="login"]/div/div/ul/li[1]/input').send_keys('你的账号')
    b.find_element_by_xpath('//*[@id="login"]/div/div/ul/li[2]/input').send_keys('你的密码')
    time.sleep(30)
    b.find_element_by_xpath('//*[@id="login"]/div/div/ul/div/li/input[1]').click()
    print("登录中...")
    b.implicitly_wait(15)
    time.sleep(5)

    # img1 = Image.open('1.jpeg')
    # img2 = Image.open('2.png')
    js = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.opacity=0'
    b.execute_script(js)
    hao = b.find_element_by_xpath('/html/body/div/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/div/canvas[2]')
    hao.screenshot('1.jpeg')
    time.sleep(2)
    js = 'document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block"'
    b.execute_script(js)
    hao2 = b.find_element_by_xpath('/html/body/div/div[2]/div[6]/div/div[1]/div[1]/div/a/div[1]/canvas')
    hao2.screenshot('2.png')
    time.sleep(2)
    js = 'document.getElementsByClassName("geetest_canvas_slice")[0].style.opacity=1'
    b.execute_script(js)
    flag=checkCode(b, img1, img2)  # 过验证码

分析图片获得距离

这里其实可以调用超级鹰等三方平台帮你算,但是还是建议自己实现一次,了解一下原理。

其实思路也很简单,调用opencv的函数先把图片处理成灰度图,然后遍历对比两张图片中像素点不一样(两个图的rgb差值>某个值)的那个像素,保存其x轴位置,我这里最后实现的时候直接比较的没处理成灰度图,准确度似乎影响不大。

move_by_offset 滑动验证码,selenium,爬虫,大数据,python,爬虫,selenium,js

代码

def is_similar(image1,image2,x,y):
    pixel1 = image1.getpixel((x,y))
    pixel2 = image2.getpixel((x,y))
    for i in range(0,3):
        if abs(pixel1[i] - pixel2[i])>=50:
            return False
    return True
def get_gap(f1,f2):
    """
    获取缺口偏移量  f1,f2为两个图片地址
    :param final_imagebg: 带缺口图片
    :param cq: 不带缺口图片
    :return:
    """
    bg =Image.open(f1)
    cq =Image.open(f2)
    for x in range(1,259):
        for y in range(1, 115):
            if is_similar(bg,cq,x,y) == False:
                # 判断成立 表示xy这个点 两张图不一样
                print(x-4)
                # 因为本身滑块有点距离根据不同屏幕分辨率大小可能有一定的误差值
                return x-4

模拟滑动行为

        首先selenium库模拟鼠标滑动大概是这样的

        #先xpath获取个元素

       button = b.find_element_by_xpath('/html/body/div/div[2]/div[6]/div/div[1]/div[2]/div[2]')

        #点击并按住元素

        ActionChains(b).click_and_hold(button).perform()

        # 拖动到x的距离 

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

        # 松开鼠标

        ActionChains(b).release(button).perform()

但是呢我们直接只有滑动x的距离会被失败出机器,会被提示怪兽吃掉了拼图,因为太快了,所以我们要做一个函数来模拟人的滑动行为,把x拆成n个逐渐增加在减小的数,然后遍历这个列表完成滑动动作

def get_track(distance):
    '''
      滑块移动轨迹
      初速度 v =0
      单位时间 t = 0.2
      位移轨迹 tracks = []
      当前位移 ccurrent = 0
      :param x:
      :return:
      '''
    v = 5
    t = 0.3
    tracks = []
    current = 0
    mid = distance * 9 / 10
    distance += 5
    while current < distance:
        if current < mid:
            a = random.randint(2, 4)  # 加速运动
        else:
            a = -random.randint(1, 3)  # 减速运动
        v0 = v
        s = v0 * t + 0.5 * a * (t ** 2)
        current += s
        tracks.append(round(s))
        v = v0 + a * t
    # if current > distance:
    #     tracks.append(int(-current-distance))
    random.shuffle(tracks)
    return tracks

然后再做一个循环 先调用获取距离的函数 再做把距离变成一个列表的函数

遍历这个列表滑动对应距离,完成验证

def checkCode(b, img_file1, img_file2):  
    scale = 1.1 
    button = b.find_element_by_xpath('/html/body/div/div[2]/div[6]/div/div[1]/div[2]/div[2]')
    try:
        c=0
        while c<=4:
           
            if c<3:
                x = int(get_gap(img_file1, img_file2)/scale)
                tracks = get_track(x)
                ActionChains(b).click_and_hold(button).perform()
                for x in tracks:
                    ActionChains(b).move_by_offset(xoffset=x, yoffset=0).perform()
                    # time.sleep(float(abs(x+1)/10))
                    # print(x)
                time.sleep(float(abs(x + 1) / 10))
                ActionChains(b).release(button).perform()
                time.sleep(5)
            c += 1
        return False
    except:
        print("ok")
        return True

上面那个获取图片也可以把canvas里内容转 base64然后保存成图片

def down_image(canvas_class, name):
    mypath = os.path.dirname((os.path.abspath(__file__)))  
    js = 'return document.getElementsByClassName("{}")[0].toDataURL("image/png");'.format(
        canvas_class)
    image_data = browser.execute_script(js)      # 执行js代码得到图片数据
    image_base64 = image_data.split(",")[1]      # 获得base64编码的图片信息
    image_bytes = base64.b64decode(image_base64)  # 将base64转为bytes类型
    image_png="{}\\{}.png".format(mypath, name)
    with open(image_png, "wb") as f:
        f.write(image_bytes)
    print("图片保存到",image_png)

仅作学习交流,欢迎加微信讨论mastercy1文章来源地址https://www.toymoban.com/news/detail-621955.html

到了这里,关于selenium爬虫|破解滑动验证码以极验为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Selenium破解滑动验证码的原理及解决思路

    1、获取页面元素信息: 使用Selenium打开目标网页,并通过相关方法获取滑块、背景图等元素的位置和属性信息。可以使用Selenium提供的定位方法(如xpath、CSS选择器等)来找到这些元素。 可以使用find_element_by_xpath或find_element_by_css_selector等方法来获取滑块和背景图元素的位置和

    2024年02月09日
    浏览(36)
  • Selenium滑动验证码破解(缺口对应却无法通过,需要做鼠标轨迹模拟)

    平台: 所涉及内容: 滑动验证码破解原理: 解决场景: 正常情况下,滑动验证码都是在canvas画出来的(残图一般是JS通过对后台返回的完整图片剪裁而来),在网页代码中可以找到对应信息 残图直接画在Canvas上,因此需要通过js代码将其导出,获取图片的base64数据(错存在直

    2024年02月12日
    浏览(31)
  • 15.网络爬虫—selenium验证码破解

    前言 : 🏘️🏘️个人简介:以山河作礼。 🎖️🎖️:Python领域新星创作者,CSDN实力新星认证 📝​📝第一篇文章《1.认识网络爬虫》获得 全站热榜第一,python领域热榜第一 。 🧾 🧾第四篇文章《4.网络爬虫—Post请求(实战演示)》 全站热榜第八 。 🧾 🧾第八篇文章《8.网

    2023年04月16日
    浏览(33)
  • selenium+ocr 破解验证码

    最近想用python做一个爬虫,但目标网站需要输入信息以及验证码才能进行信息查询,然后才能爬取相应信息,于是就想到了使用selenium进行信息输入,先爬取验证码图片,然后利用OCR技术来识别验证码,接着爬取目标信息,思路很清晰,但做起来就出现一堆问题,于是想在这

    2024年02月04日
    浏览(34)
  • java爬虫破解滑块验证码

    使用技术:java+Selenium 废话:         有爬虫,自然就有反爬虫,就像病毒和杀毒软件一样,有攻就有防,两者彼此推进发展。而目前最流行的反爬技术验证码,为了防止爬虫自动注册,批量生成垃圾账号,几乎所有网站的注册页面都会用到验证码技术。其实验证码的英文

    2023年04月09日
    浏览(31)
  • 极验系列文章一:极验三代 极验验证码整体流程分析

    作为一位js逆向爱好者,写本篇文章在于纯技术分析。无任何不良商业目的。旨在提高大家的网络安全意识,共同维护网络安全环境!请不要做任何有损国家或其他集体或个人的事情, 否者后果自负!本文如有任何侵权行为,请马上联系作者,立马删除。 目标地址:aHR0cHM6

    2024年02月14日
    浏览(27)
  • Cloudflare5s盾破解|爬虫自动验证|解决方案

    一、什么是Cloudflare5s盾 Cloudflare是一个网站加速和安全服务提供商。Cloudflare  5s盾是指网站防御模式,它可以防止恶意流量和攻击,如DDoS、SQL注入、XSS等,保护网站免受恶意攻击和流量泛滥带来的服务中断或数据泄漏等问题。此外,Cloudflare  5s盾还可以通过Web应用程序防火

    2024年02月12日
    浏览(30)
  • selenium利用图鉴破滑动验证码,登录信息门户

    验证码类型: 总结: 1.学习到了selenium中的动作链模块。 首先 from selenium.webdriver.common.action_chains import ActionChains导入包 使用方法: 首先启动动作链:action = webdriver.ActionChains(browser) action.click_and_hold(定位滑块的位置).perform() # 按住滑块 action.move_by_offset(x坐标,y坐标)  # 移动滑块

    2024年01月23日
    浏览(32)
  • selenium破解滑块验证码自动查询+获取后续表单数据

    一、装载好chromedriver之后,运行命令行 \\\"chrome.exe\\\"(路径) --remote-debugging-port=9222 打开谷歌浏览器。 二、使用selenium打开网页:  三、获取输入框批量输入数据,并破解验证码: 使用 driver.find_element_by_xpath 获取element时,xpath可通过浏览器打开网站,使用检查功能,找到element所

    2024年02月12日
    浏览(40)
  • python selenium模块联合带带弟弟破解滑块验证码

    Python 使用 Selenium 模块模拟用户操作,滑动滑块来破解验证码

    2024年04月14日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包