【网络爬虫篇】逆向实战—某东:滑块验证码(逆向登录)2024.8.7最新发布,包干货,包详细
【网络爬虫篇】更多优秀文章借鉴:
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;定位小滑块元素。

# 计算滑块需要拖动的距离,由于图片的真实宽度为360,而展示的图片宽度为242,且res = res * 242 * 1.25 // 360print("本次应该滑动滑块的距离为:", 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的相关操作拉动滑块;而这里有个问题,即认为需要的滑块位置与实际获得的滑块位置。

获取小滑块在网页上的位置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
结果展示


由上图信息可见,用户自动化登录成功~
注意:若需要全部源代码,请在后台私信博主~
创作不易,请点个赞哦~
还有更多优秀作品在博主主页~
相关文章:
【网络爬虫篇】逆向实战—某东:滑块验证码(逆向登录)2024.8.7最新发布,包干货,包详细
【网络爬虫篇】更多优秀文章借鉴: 1. 使用Selenium实现黑马头条滑块自动登录 2. 使用多线程采集爬取豆瓣top250电影榜 3. 使用Scrapy爬取去哪儿网游记数据 4. 数据采集技术综合项目实战1:国家水稻网数据采集与分析 5. 数据采集技术综合项目实战2&#x…...
为什么优质的酱香白酒都会带点苦味?
大家好,我是酱酒亮哥,不知大家有没有发现,在制作一杯美味的咖啡或是烘焙一块香脆的面包时,制作过程中都会有一些独特的味道和香气产生,对吧?同样地,酱香白酒的酿造过程也是一个复杂而精细的化学…...
软件测试常见面试题
软件测试阶段分为单元测试,集成测试,系统测试,验收测试。单元测试策略为对代码中的函数方法进行测试,目的是发现代码的问题。集成测试策略是模块中组合起来进行测试,要求发现与接口有关的问题。系统测试策略是子系统的…...
面试经典算法150题系列-接雨水
接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,…...
【C++】 类型转换深度探索:揭开类型转换的奥秘
🌈 个人主页:Zfox_ 🔥 系列专栏:C从入门到精通 目录 一: 🚀 C语言中的类型转换 二: 🔥 为什么C需要四种类型转换 三: 🔥 C强制类型转换 🥝 3.1 st…...
深入探索Webkit的Web Authentication API:安全与便捷的融合
Web Authentication API,通常被称为WebAuthn,是一个新兴的Web标准,旨在通过提供更安全、更便捷的认证方式来改善用户的在线体验。随着Webkit对WebAuthn的支持日益增强,本文将深入探讨这一API的功能、实现方式以及如何在Webkit浏览…...
Vue - 关于v-wave 波浪动画组件
Vue - 关于v-wave 波浪动画组件 这个动画库可以在标签中添加新的v-wave属性,来让点击标签元素后添加漂亮的波纹效果,并且可以根据父元素自动形成波纹的颜色,也可以自定义波纹颜色,持续时间,透明度,触发的对…...
计算机网络408考研 2019
计算机网络408考研2019年真题解析_哔哩哔哩_bilibili 2019 1 1 1 1...
实时捕捉与追溯:得物基于 eBPF 打造云上网络连接异常摄像头
近期我们容器 SRE 团队基于 eBPF 技术建设网络连接异常感知能力,灰度上线过程中发现了生产环境 10 以上的应用配置错误、程序 Bug 等问题。在和应用负责同学同步风险过程中,大家都挺好奇我们如何实现在对应用无侵入的情况下发现服务连接异常的。本篇文档…...
ubuntu14.04图形界面配置
Ubuntu系统启动,输入用户密码后,屏幕显示彩色背景,但是始终不能进入图形界面。 如果你也遇到过这种情况,可以参照以下方法解决(在 ubuntu14.04 验证)。 同时按下 alt ctrl F1,屏幕出现 tty1&a…...
51单片机-第八节-蜂鸣器
一、什么是蜂鸣器? 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器: 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可…...
Windows命令查看WiFi密码
查看所有已保存的WiFi网络 (以管理员身份)输入以下命令 netsh wlan show profiles查看某个WiFi网络的密码 netsh wlan show profile name"你的网络名" keyclear在输出中,在关键内容(Key Content)字段下找…...
不同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ
ARM架构、X86架构、Window系统环境下RabbitMQ的安装 RabbitMQ安装1 Erlang语言介绍2 安装Erlang2.1 ARM架构的CentOS虚拟机中安装Erlang2.2 X86架构的CentOS虚拟机中安装Erlang2.3 Windows系统安装Erlang2.3.1 下载Erlang2.3.2 安装Erlang2.3.3 配置Erlang2.3.4 检测Erlang 3.安…...
C++(week16): C++提高:(六) Qt提高
文章目录 四、Qt的元对象系统1.元对象和MOC(1)自省 和 反射(2)Qt是怎样支持元对象系统的?(3)支持元对象系统的三个要求(4)元对象系统的功能(5)动态属性 2.信号和槽机制(1)信号与槽机制的基本原理(2)自定义信号、自定义槽函数①自定义信号②自定义槽③关联 connect (…...
go 时间转时间戳的时区设置问题
昨天遇到一个问题,在完成时间转换时间戳,在后续测试中发现转换后的时间戳转成时间后,时间发生错误,时间和转换时间不一致问题 如下: package mainimport ("fmt""time" )func main() {Start : &q…...
MySQL 常见日志清理策略
前言: MySQL 数据库服务器使用多种类型的日志来记录操作和事件,这对于故障诊断、审计和性能分析非常重要。然而,这些日志文件会随着时间的推移而不断增长,可能会占用大量的磁盘空间。因此,定期清理这些日志是必要的&a…...
3大管人绝招让你的手下心服口服
3大管人绝招让你的手下心服口服 一:差异化管理,玩弄人性 谁赞成,谁反对,看清楚谁顺从自己,谁反对自己之后,接下来要做的便是区别对待。 给听话的下属最好的资源、最轻松简单的工作、最高的待遇…...
useImperativeHandle 是什么?你可以理解为 vue3 的 expose
useImperativeHandle 确实类似于 Vue 3 的 expose,两者都用于控制子组件向父组件暴露的接口。 在 React 中,useImperativeHandle 需要与 forwardRef 一起使用,原因如下: 转发引用:forwardRef 允许父组件将 ref 传递给…...
《Techporters架构搭建》-Day05 属性校验
属性校验 前言Validated基础用法集合校验分组校验嵌套校验自定义校验器 源码地址 前言 在项目开发过程中,经常遇到需要对传递的参数进行校验,比如某个参数字段是否为空、值的取值是否在约定范围、格式是否合法等等,最原始的写法,…...
HTTP的场景实践
HTTP的场景实践:任选一个浏览器,对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存: Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存: ETag用于标识资源的唯一标识符,…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
【java面试】微服务篇
【java面试】微服务篇 一、总体框架二、Springcloud(一)Springcloud五大组件(二)服务注册和发现1、Eureka2、Nacos (三)负载均衡1、Ribbon负载均衡流程2、Ribbon负载均衡策略3、自定义负载均衡策略4、总结 …...
