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

news2024/12/26 22:04:52

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

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/1991623.html

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

相关文章

电子画册设计源码系统:轻松制作各行各业在线画册展示 带完整的安装代码包以及搭建教程

在信息化时代,传统的纸质画册已经无法满足现代人的阅读需求。而电子画册具有信息更新迅速、展示方式多样、交互性强等优点,能够更好地满足用户对于信息的获取和展示需求。同时,随着移动互联网的普及,用户对于在线浏览和分享的需求…

GEE:设置自定义风格底图

作者:CSDN _养乐多_ 本文将介绍如何在 Google Earth Engine (GEE)平台上,设置底图风格。结果如下图所示, 文章目录 一、代码二、完整代码链接 一、代码 以下代码将GEE的底图根据自己的需求设置风格。 var land { …

为啥https比http慢

Https有ssl的握手 HTTP没有 HTTPS TCP 和HTTP 的TCP 时间差不是很大 HTTPS请求中,ssl所占的时间比例是请求时间总和93.37%, HTTPS请求中,ssl的请求会是tcp请求的14倍,而HTTP中没有这个问题 建议:对安全要求不是很高的,不要使用https请求 图例

【漏洞复现】PowerPMS——APPGetUser——SQL注入

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 PowerPMS 是一个集成的企业管理系统,涵盖了财务管理、销售管理、…

常见八股面试题:Dubbo 和 Spring Cloud Gateway 有什么区别?

大家好,我是鸭鸭! 此答案节选自鸭鸭最近弄的面试刷题神器面试鸭,更多大厂常问面试题,可以点击进行阅读哈! 目前这个面试刷题神器刚出,有网页和小程序双端可以阅读! 回归面试题! …

Android中的Binder

binder是Android平台的一种跨进程通信(IPC)机制,从应用层角度来说,binder是客户端和服务端进行通信的媒介。 ipc原理 ipc通信指的是两个进程之间交换数据,如图中的client进程和server进程。 Android为每个进程提供了…

中值定理适用题型

探讨f 和 f’用 拉格朗日中值定理探讨f与f的高阶导数泰格公式探讨 f, g 和 f’, g’柯西中值定理探讨 f’0罗尔定理、费马定理f0零点定理 延伸: 拉格朗日中值定理的重要作用之一:用 f’ 的大小来限定 f 的变化幅度大小

快团团供货团长帮卖团长如何反向核销订单?

一、功能说明 当已核销的订单需要处理退款时,可以先操作反向核销(取消核销),再处理退款。 二、具体操作步骤 在商品核销中找到出想要“反向核销”的订单,在本次核销中点“-”号,再点击批量核销即可。 注意&…

【每日刷题】Day96

【每日刷题】Day96 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. LCP 44. 开幕式焰火 - 力扣(LeetCode) 2. 1022. 从根到叶的二进制数之和 - …

如何分析KDJ指标?九方智投学习机来帮忙

(九方智投属于九方智投控股有限公司(9636.HK)旗下品牌)      投资中,投资者需要参考的内容有很多,例如KDJ指标,KDJ指标又叫随机指标,是一种相当新颖、实用的技术分析指标&#x…

RJ TextEd 配置简易C/C++ 编译运行环境

前提条件 1.Mingw GCC已经按照且配置环境变量 2.RJ TextEd已安装 步骤 1.配置工具 2.新建 3.填写内容 以GCC为例 4.重复新建G/Run 为了同时支持C和C,有三个工具,gcc g run 5.设置快捷键 注意不能和已有的冲突 验证

ThreadLocal 详解(二)ThreadLocal的原理

前言:Threadlocal的原理涉及两个方面:Threadlocal实例和ThreadlocalMap;这是我画的草图 一.Threadlocal实例 每个Threadlocal对象实际上是一个容器,用于储存线程本地的变量副本。每个线程都可以拥有自己的Threadlocal实例&#xf…

快手如何改ip地址到另外城市

在现今的数字时代,社交媒体平台如快手已成为我们日常生活中不可或缺的一部分。无论是分享生活点滴、观看娱乐视频,还是进行商业推广,快手都为我们提供了广阔的空间。然而,在使用快手的过程中,一些用户可能会遇到需要更…

mapbox-gl 实现房间面生成墙(借助jsts)

文章目录 一、前言二、面生成墙方法示例 一、前言 当我们从室外放大到室内展示室内图层时,我们可能只有房间面的数据,这时要展示房间墙数据,就需要借助工具对房间面进行缓冲,但是数据变动时,我们还要再次进行一下缓冲…

【算法专题】哈希表

哈希表是什么?有什么用?什么时候使用?怎么用? 哈希表是存储数据对的容器;作用在于快速查找某个元素;当我们需要频繁地查找元素时,会考虑使用哈希表;在算法题中,我们通常使…

基于el-table的表格点选和框选功能

开篇 本篇文章旨在实现一个基于el-table的表格点选和框选功能,除此之外,还支持多种模式的切换、自定义勾选日期等。且,该表格后续可能还会持续优化! 功能介绍 表格点选和框选功能(没有点击ctrl键的情况下)…

AI安全新纪元:智能体驱动的网络安全新范式

近日,ISC.AI 2024第十二届互联网安全大会在北京盛大开幕。本次大会以"打造安全大模型,引领安全行业革命"为主题,旨在呼吁行业以大模型重塑安全体系,以保障数字经济的稳健发展。 在企业安全运营与策略实践论坛上&#x…

人工智能时代,数字化工厂如何改革?提升竞争力?

在人工智能时代,数字化工厂通过数据驱动的决策、智能制造、柔性生产、物联网整合以及人机协作,实现生产效率和产品质量的全面提升,并不断创新以保持竞争力。 --题记 在人工智能时代,数字化工厂的改革…

usb摄像头 按钮 静止按钮

usb摄像头 按钮 静止按钮 来分析一个UVC的摄像头的枚举信息 UVC学习:UVC中断端点介绍 https://www.eet-china.com/mp/a269529.html 输入命令lsusb -d 0c45:62f1 -v https://www.miaokee.com/705548.html >Video Class-Specific VS Video Input Header Descrip…

如何恢复未保存/删除的 WPS 文档文件

“如何恢复 WPS 文件?文件已损坏,似乎我之前没有保存过,软件退出,导致文件丢失。有什么方法可以恢复未保存的 WPS 文档吗?” WPS 办公套件是金山软件开发的一款很棒的套件。说实话,它更适合个人和办公室工…