【网络爬虫篇】“逆向实战—某东:滑块验证码(逆向登录)”自动化实现滑块登录验证(2024.8.7)最新发布,包干货,包详细

news2024/9/20 1:06:32

  【网络爬虫篇】更多优秀文章借鉴:

1. 使用Selenium实现黑马头条滑块自动登录

2. 使用多线程采集爬取豆瓣top250电影榜

3. 使用Scrapy爬取去哪儿网游记数据 

4. 数据采集技术综合项目实战1:国家水稻网数据采集与分析

5. 数据采集技术综合项目实战2:某东苹果15数据采集与分析

6. 数据采集技术综合案例实战3:b站弹幕采集与分析

7. 逆向实战—京东:滑块验证码(逆向登录)

导航小助手

项目介绍及需求:

实现步骤

结果展示


项目介绍及需求:

本项目主要是针对“逆向实战—京东:滑块验证码(逆向登录)”。1.通过Selenium与selector、Xpath交互自动化地寻找滑块拼接所需要的元素。2.针对特定元素使用pyautogui模拟鼠标的人为操作。3.当滑块验证码登录成功后,将用户的成功登录的cookie保存到本地的txt文件;在用户爬取京东相关特定的数据时,只需要将记载着用户的cookie的txt文件进行读入,即可避免浏览器的用户验证行为。

实现步骤

1. 首先导入相关库,解决我们的相关需求

import base64 # 用于处理 Base64 编码的图像。
import cv2 # OpenCV,用于图像处理和模式识别,这里主要用于识别滑块验证码的位置。
from selenium import webdriver # 从selenium库中引入webdriver模块,用于控制浏览器的自动化操作。
from selenium.webdriver.common.by import By # 引入selenium中的By类,它提供了查找网页元素的不同策略,如通过CSS选择器、ID、类名等。
from selenium.webdriver.support.ui import WebDriverWait # 用于等待页面上的元素出现,这在处理动态网页时非常重要。
from selenium.webdriver.support import expected_conditions as EC # 用于检查元素是否出现在DOM中。
import time # 降低访问频率
import pyautogui # 用于模拟鼠标和键盘操作,这里用于处理滑块验证码的拖动操作。

2.在自定义的login()函数中,使用Selenium的内置参数元素的selector定位滑块验证码的相关元素

driver = webdriver.Firefox()
driver.get('https://www.jd.com/')
# 最大化浏览器窗口,确保自动化操作不会因为窗口大小问题而失败。
driver.maximize_window()
# driver.execute_script('document.body.style.zoom="0.8"')
# 在京东主页面找到登录按钮,进入登录页面
driver.find_element(by=By.CSS_SELECTOR, value='#ttbar-login > a.link-login > span.style-red').click()

# 输入自己的手机号码
driver.find_element(by=By.CSS_SELECTOR, value='#loginname').send_keys("xxx")
# 输入自己的密码
driver.find_element(by=By.CSS_SELECTOR, value='#nloginpwd').send_keys("xxx")

# 定位并点击确认按钮
driver.find_element(by=By.CSS_SELECTOR, value='#formlogin > div.item.item-fore5').click()

# 休息3秒,等待滑块验证码的加载
time.sleep(3)

3.在自定义的login()函数中,使用一个死循环,跳出循环的条件为用户滑块验证成功,否则不断重复定位图片、写入图片、查找距离操作。

# 设置循环,当滑块验证失败时,不断重新获取滑块验证码并再次进行滑动验证
    while True:
        try:
            big = driver.find_element(by=By.XPATH, value='//div[@class="JDJRV-bigimg"]/img')
            small = driver.find_element(by=By.XPATH, value='//div[@class="JDJRV-smallimg"]/img')

            # 使用get_attribute方法获取背景图像的src属性值,并去除前22个字符,因为它们通常包含data: image / png;base64, 这样的前缀。
            big = big.get_attribute('src')[22:]
            small = small.get_attribute('src')[22:]

            
            # base64.b64decode(big):这个函数用于解码Base64编码的字符串。Base64是一种用于将二进制数据转换为可打印字符的编码方式,
            with open('./pictures/slidepicture.png', mode='wb') as f:
                f.write(base64.b64decode(big))

            with open('./pictures/background.png', mode='wb') as f:
                f.write(base64.b64decode(small))

            # 调用FindPic拖动滑块拼接函数,识别滑块的位置。
            res = FindPic()

4.在自定义的滑块拼接距离FindPic()函数中,使用OpenCV中的相关图像匹配方法,匹配滑块与滑块背景图片的缺口关系,找到一个从滑块左上端到滑块背景最大值和最小值的距离,这里我取的是最小值。

def FindPic(target='./pictures/slidepicture.png', template='./pictures/background.png'):

    # 使用cv2.imread方法读取目标图像,并将其转换为灰度图像。
    # 灰度模式意味着图像只包含亮度信息,没有颜色信息,因此每个像素点只有一个灰度值。
    target_rgb = cv2.imread(target, 0)
    print(target_rgb.shape)

    template_rgb = cv2.imread(template,0)

    '''
    执行模板匹配后,返回的结果是一个二维浮点数组,
    该数组的大小与输入的目标图像相同,
    但包含的是匹配系数而不是图像像素值。通过分析这个结果图,
    可以找到模板图像在目标图像中的最佳匹配位置。
    '''
    # 使用cv2.matchTemplate方法在目标图像中搜索模板图像,使用cv2.TM_CCOEFF_NORMED方法进行匹配。
    res = cv2.matchTemplate(target_rgb, template_rgb, cv2.TM_CCOEFF_NORMED)
    # 在给定的数组或图像res中找到最小值和最大值及其位置。
    value = cv2.minMaxLoc(res)
    return value[2][0]

5. 在自定义的login()函数的while循环中计算滑块应该滑动的距离。由于计算滑块需要拖动的距离,由于图片的真实宽度为360,而展示的图片宽度为242,且在我的电脑中屏幕是以125%的显示,125/100=1.25。所以真实的滑动距离应该为res = res * 242 * 1.25 // 360;定位小滑块元素。

2f4059e7f6af4f2cb728e0df6511f7a7.png

# 计算滑块需要拖动的距离,由于图片的真实宽度为360,而展示的图片宽度为242,且
            res = res * 242 * 1.25 // 360
            print("本次应该滑动滑块的距离为:", res)
# 使用WebDriverWait和presence_of_element_located等待滑块元素出现,并将其保存在slider变量中。
            slider = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#JDJRV-wrap-loginsubmit > div > div > div > div.JDJRV-img-panel.JDJRV-click-bind-suspend > div.JDJRV-img-wrap > div.JDJRV-smallimg > img')))

6.当然,有的小伙伴此时会想为什么不用Selenium自带的模拟滑动操作,在经过实验后发现通过Selenium滑动滑块操作是不被京东所认可的,结果小伙伴们可以自己实验。

'''
            使用Selenium自带的模拟拉动滑块操作
            1. action = ActionChains(driver)
            2. action.click_and_hold(slider).move_by_offset(res,0).release().perform()
            '''

7.获取小滑块在浏览器上的在xy轴的坐标位置,并使用pyautogui的相关操作拉动滑块;而这里有个问题,即认为需要的滑块位置与实际获得的滑块位置。

92e93bdb66a04c029b5ebb1a01cc62f0.png

 获取小滑块在网页上的位置
            lo = slider.location
            # 计算鼠标需要移动到的x坐标位置,这里可能涉及到滑块和网页元素的比例和位置关系。
            x = int(lo.get('x')*1.25) + 20 # 小滑块在浏览器上的 x 距离
            y = int(lo.get('y')*1.25) + 125 # 小滑块在浏览器上的 y 距离

 8. 利用pyautogui对小滑块进行滑动“漂移”操作,登录成功即将用户cookie写入txt文件。

            '''
            # 使小滑块进行飘移操作
            1. duration=0.2 指定了鼠标移动到目标位置所需的时间,单位是秒。
            2. 先故意使得小滑块拉过头,再慢慢恢复计算出来的距离
            '''
            pyautogui.moveTo(x+res+15, y+6,duration = 0.2)
            pyautogui.moveTo(x+res-10, y-3,duration = 0.3)
            pyautogui.moveTo(x+res, y, duration = 0.3)
            pyautogui.mouseUp()

            # 未验证成功,休息5秒,等待下一次模拟登录
            time.sleep(5)
            # 若登录成功,则将本次登录成功的用户信息记录于txt文件中
        except:
            cookies = driver.get_cookies()
            cookie_string = "; ".join(f"{cookie['name']}={cookie['value']}" for cookie in cookies)
            break

结果展示

由上图信息可见,用户自动化登录成功~

注意:若需要全部源代码,请在后台私信博主~

创作不易,请点个赞哦~

还有更多优秀作品在博主主页~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1991063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【leetcode】根据二叉树创建字符串、二叉树的前中后遍历(非递归链表实现二叉树)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…

扫地机/洗地机语音芯片ic,工业级声音播放芯片ic,NV170H

扫地机/洗地机作为智能家居清洁领域的创新驱动力,不仅赋予了清洁设备,还需要一些智能化的功能,比如语音提示,将用户体验提升至全新高度。NV170H语音芯片成为了首要选择。 NV170H语音芯片是一款OTP(‌一次性可编程&…

html+css网页设计 酷狗首页1个页面 (无js)

htmlcss网页设计 酷狗首页1个页面无js功能 页面还原度80% 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 …

干货满满!Stable Diffusion 从入门到精通之提示词手册,免费分享,自学转行,零基础首选!

前言 Stable Diffusion 技术把 AI 图像生成提高到了一个全新高度,文生图 Text to image 生成质量很大程度上取决于你的提示词 Prompt 好不好。本文从“如何写好提示词”出发,从提示词构成、调整规则和 AIGC辅助工具等角度,对文生图的提示词输…

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发

腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发 🚀 文章目录 腾讯云AI代码助手评测:如何智能高效完成Go语言Web项目开发 🚀背景引言开发环境介绍腾讯云AI代码助手使用实例1. 代码补全2. 技术对话3. 代码优化4. 规范代码…

LVS实验(实现服务器集群的负载均衡)

基本概念 LVS(Linux Virtual Server)是Linux虚拟服务器的简称。 LVS通过将一个真实服务器集群虚拟成一台服务器来对外提供服务,同时在集群内部实现负载均衡。这种技术能够显著提高服务的处理能力和可靠性,降低单台服务器的负载压…

C++——类和对象(part1)

前言 本篇博客来为大家介绍C中的一个重要内容——类与对象,这部分的内容较多,将会分三篇文章来介绍,本篇为第一篇,如果你学习C或对C感兴趣,那么请继续往下阅读,下面进入正文部分。 1. 类的定义 1.1 类定…

【Material-UI】Button Group:实验性 API 详解

文章目录 一、按钮组概述1. 组件介绍2. 基本用法 二、实验性 API 详解1. LoadingButton 组件1.1 基本用法1.2 位置属性 三、实验性 API 的应用场景1. 数据加载按钮2. 提交表单按钮3. 保存操作按钮 四、按钮组的样式定制1. 变体(Variants)2. 颜色&#xf…

解决Ubuntu/Kali手动创建的启动器在dock上没有图标,且不能“添加到dock中“的问题

文章目录 问题描述问题解决解决方案 1 | 添加StartupWMClass字段解决方案 2 | 重命名文件名 如何获取 WM 值?方式 1 | xprop 命令方式 2 | 直接查看 问题描述 这个启动器无论是在菜单还是桌面都是正常的,只有在dock中没有图标,且不像其他APP…

《向量数据库指南》——非结构化数据的行业需求及向量数据库的关键角色

非结构化数据的行业需求及向量数据库的关键角色 引言 在当今数字化时代,数据已成为驱动社会进步与产业升级的核心要素。随着技术的飞速发展,特别是人工智能(AI)技术的广泛应用,数据的类型与规模正以前所未有的速度增长。其中,非结构化数据作为数据海洋中的主体部分,其…

同态加密和SEAL库的介绍(六)BGV 方案

前面介绍 BFV 和 CKKS 加密方案,这两者更为常用。并且也解释了 Batch Encoder 和 级别的概念,这对接下来演示 BGV 会很有帮助。 一、BGV简介 BGV (Brakerski-Gentry-Vaikuntanathan) 方案 是一种基于环学习同态加密(RLWE)问题的加…

霍尼韦尔落地灯怎么样?书客、霍尼、柏曼护眼大路灯多维度实测

霍尼韦尔落地灯怎么样?护眼大路灯作为最适合新时代学生照明工具,以良好的作用表现得到了许多家长及社会人士的认同,但同时也因为火爆,市面上的品牌繁杂,出现了许多劣质或者不专业的产品,促使一些人不知道如…

学习java的日子 Day64 学生管理系统 web2.0 web版本

MVC设计模式 概念 - 代码的分层 MVC:项目分层的思想 字母表示层理解MModle模型层业务的具体实现VView视图层展示数据CController控制器层控制业务流程(跳转) 1.细化理解层数 Controller:控制器层,用于存放Servlet&…

中职云计算实训室

一、实训室建设背景 随着信息技术的飞速发展,云计算已成为推动数字化转型、促进经济社会发展的重要力量。《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出,要加快数字化发展,建设数字中国。云计算作为数…

我的创新大赛经验分享:打造一份出色的商业计划书

我的创新大赛经验分享:打造一份出色的商业计划书 前言封面和目录:第一印象至关重要执行摘要:一语中的项目背景:市场与行业的深度剖析产品/服务:展现独特性和竞争力市场分析:深入洞察目标市场商业模式&#…

等保测评练习卷30

等级保护初级测评师试题30 姓名: 成绩: 一、判断题(10110分) 1.要想使用远程桌面的SSL加密功能,运行的操作系统必须为Windows 2000 Server或以上版本。&#xf…

排序算法1:堆排序,直接插入排序与希尔排序

前言 前些时间,博主带领着大家学习了数据结构,数据结构中的二叉树更是其中的重中之重,我们之前了解了二叉树是现实计算机存储数据的一种重要形式。借助其结构,我们还能实现更多高效的功能。 今天我们将进入排序算法的章节&#…

Spring MVC框架学习笔记

学习视频:10001 Spring MVC概述_哔哩哔哩_bilibili~11005 请求映射方式_哔哩哔哩_bilibili 目录 1.概述 Java EE三层架构 Spring MVC在三层架构中的位置 ​编辑 Spring MVC在表现层的作用 Spring MVC的特点 2.Spring MVC入门程序 代码实现 Spring MVC工作原理 Spring …

ETF套利有什么好用的软件?ETF套利神器—万得宏汇

ETF套利全场景覆盖,支持瞬时、趋势、事件套利等业务场景。丰富的组合交易工具、灵活高效的窗口设置,叠加ETF利润计算器联动,让ETF投资更轻松。 L2行情极速柜台,交易快人一步 市场行情瞬息万变,行情速度决定交易速度&a…

智能化解决方案:提升汽车制造图文档发送效率,实现高效传输

汽车制造业企业数据外发需求频繁,不仅有与异地研发机构间、供应商之间的协同研发文件交换,还有与外包供应商及零部件供应商之间的基于价值链的协同关系。主要涉及的数据类型有:汽车制造图文档发送、研发数据发送、项目文件发送、反馈数据与协…