Python解决反爬机制_滑块解锁的思路以及踩的坑+心得_一蓑烟雨任平生

本文主要是介绍Python解决反爬机制_滑块解锁的思路以及踩的坑+心得_一蓑烟雨任平生,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 目标
    • 滑块解锁分三种
      • 1.每次验证的第一个图都是定死的
      • 2.验证滑块不通过图片不变
      • 3.无论你验证成功失败,你拉一次图片位置变一次
  • 一、下载滑块与背景图
    • 1.利用canvas标签下载图片(此路不通)
    • 2.利用selenium的电脑截图下载图片(此路不通)
    • 3.利用selenium的鼠标下载图片(成功)
  • 二、计算滑块到空缺的距离
    • 1.第一种方法对比像素(此路不通)
    • 2.第二种方法对比滑块和背景(成功)
    • 3.第二种方法增强版
  • 三、模仿人为滑动破解
    • 1.计算出速度
    • 2.网上失败代码不粘贴了
  • 总结


前言

网上的的滑块解锁图形,五花八门,十个里面九个瘫,步步都是坑


目标

目标很简单,就是把滑块放进缺少的图片中

在这里插入图片描述


滑块解锁分三种

1.每次验证的第一个图都是定死的

也就是说,访问第一次之后,直接F12算出面积,直接把长度放入代码中即可

2.验证滑块不通过图片不变

这种的话,比较第一种较难点,思路很简单,就是设置一个长度,不断的递增就可以了,比如第一个图可能要求拉15cm也可能是拉33cm才可以,但是我就从3cm开始测试就可以了,3cm不行6cm,6cm不行9cm,反正没刷新图片15cm永远都在那里等着我

3.无论你验证成功失败,你拉一次图片位置变一次

这就是今天的反爬虫机制最高的境界,时时刻刻变位置,前两种的思路都不可以用了,只能计算出长度进行拉取,这也就是这篇博客要讲解的重头戏


一、下载滑块与背景图

1.利用canvas标签下载图片(此路不通)

这是大佬地址,我看了他的博客,只感觉在纸上谈兵,还对骂了一番

附上大佬的代码

def download_yzm(self):js = '''return document.getElementById('puzzle-lost').toDataURL()'''base64str = self.driver.execute_script(js)resultstr = base64str.strip("data:image/png;base64")resultstr = resultstr[1:]imagedata = base64.b64decode(resultstr)file = open('./bg.png', "wb")file.write(imagedata)file.close()

首先,不看别的,只看到js里面有return 我就知道会报错了,我很纳闷他试了没


在console里面执行js不知道哪个前端加过return才会有数据显示??


他没有实践,所以没有考虑很多问题,比如canvas下载图片地址toDataURL是存在跨域问题的,又比如每次图片滑动的距离并不是写死的,背景图会时时刻刻变化的,所以写代码还是多动手比较好


2.利用selenium的电脑截图下载图片(此路不通)

#移动前获取滑块那部分页面上的图片用selenium截图的形式
driver.find_elements_by_xpath('//*[@class="yidun_bg-img"]')[1].screenshot('0.png')
bg_act = cv.imread('0.png')
bg_act_height, bg_act_width = bg_act.shape[0],bg_act.shape[1]
bg = cv.imread('bg_img.png')
bg_height, bg_width = bg.shape[0],bg.shape[1]
block = cv.imread('img.png', -1)
scale = bg_act_height * 1.0 / bg_height
scale1 = bg_act_width * 1.0 / bg_width
block_act = cv.resize(block, (0,0), fx = scale, fy=scale)print('scale: ', scale, scale1)
x1,x2 =get_image_deviation(bg, block)
x1 = int(x1*scale)
print("x1x2=", x1, x2)#部分代码
ActionChains(滑块元素).move_by_offset(xoffset= 移动上面生成的距离, yoffset=0).perform()#第一次移动后二次识别部分代码driver.find_elements_by_xpath('//*[@class="yidun_bg-img"]')[1].screenshot('bg1.png')
bg_act1 = cv.imread('bg1.png')
x3,x4=get_image_deviation(bg_act1, block_act)print("x3x4=", x3, x4)
time.sleep(5)
ActionChains(driver).move_by_offset(xoffset= x1-x3, yoffset=0).perform()

两次图片匹配,识别率来完成,我呵呵了,这个鬼才也算有想法的,不断匹配识别来达到目的,但是电脑截图下来的图片你存哪里了,不保存放内存中自己消化了?图片不变化的话,或许你这种方法有点用

3.利用selenium的鼠标下载图片(成功)

这个就6的狠了,人为的进行打开网页点击保存图片,这里保存图片参看我另外一篇博客,网上很多文章也不行,自己摸索出来的最终解决方案

Python selenium自动化脚本右键保存图片_一蓑烟雨任平生

保存并不算很难,也就耗用了我两小时研究,网上天花乱坠,没营养的代码一堆一堆的,走了很多弯路,这里保存之后命名图片名称是一个难点,毕竟锁定IP并不是锁定一次滑动验证码就可以了,会频繁的锁定,所以要频繁的滑动解锁,这里重点讲解下selenium的删除和命名文件

直接上代码啊

def rnameFile():# 查找文件path = "E:\\xiazai"#这是你浏览器下载地址# os.listdir()方法,列出来所有文件# 返回path指定的文件夹包含的文件或文件夹的名字的列表files = os.listdir(path)# 主逻辑# 删除该文件os.remove("E:\\xiazai\\bg.png")print('删除北京成功')# 删除该文件os.remove("E:\\xiazai\\huakuai.png")print('删除滑块图片成功')# 对于批量的操作,使用FOR循环for f in files:# 调试代码的方法:关键地方打上print语句,判断这一步是不是执行成功print(f)if "1" in f and f.endswith(".png"):# 这里应该打印下载(1).pngprint("原来的文件名字是:{}".format(f))# 找到老的文件所在的位置old_file = os.path.join(path, f)print("old_file is {}".format(old_file))# 指定新文件的位置,如果没有使用这个方法,则新文件名生成在本项目的目录中new_file = os.path.join(path, "bg.png")print("File will be renamed as:{}".format(new_file))os.rename(old_file, new_file)print("修改后的文件名是:{}".format(f))elif "下载" in f and f.endswith(".png"):# 这里应该打印下载.pngprint("原来的文件名字是:{}".format(f))# 找到老的文件所在的位置old_file = os.path.join(path, f)print("old_file is {}".format(old_file))# 指定新文件的位置,如果没有使用这个方法,则新文件名生成在本项目的目录中new_file = os.path.join(path, "huakuai.png")print("File will be renamed as:{}".format(new_file))os.rename(old_file, new_file)print("修改后的文件名是:{}".format(f))if __name__ == '__main__':rnameFile()

二、计算滑块到空缺的距离

1.第一种方法对比像素(此路不通)

#.缺口图片匹配缺口所在图片那一行图片可以提高他识别率
def get_image_deviation():##读取滑块图block = cv.imread("img.png", -1) #完整图片有个缺口backimg = cv.imread("bg_img.png") #缺口图片# block = cv.resize(block, (240, 480))# backimg = cv.resize(block, (240, 480))##灰度化gray_backimg = cv.cvtColor(backimg, cv.COLOR_RGB2GRAY)blockWidth, blockHeight = block.shape[1], block.shape[0]##识别滑块图前景###由于滑块图为带透明的png,可根据透明通道来判断前景位置##识别物体框,生成blockmaskleft = blockWidthright = 0top = blockHeightbottom = 0for i in range(0, blockHeight):for j in range(0, blockWidth):if block[i, j, 3] > 0:if j <= left:left = jif j >= right:right = jif i <= top:top = iif i >= bottom:bottom = iblockBox = block[top:bottom, left:right]blockBox_width, blockBox_height = blockBox.shape[1], blockBox.shape[0]print(blockBox_width)blockMask = np.zeros([blockBox_height, blockBox_width], np.uint8)for i in range(0, blockBox_height):for j in range(0, blockBox_width):if blockBox[i, j, 3] > 0:blockMask[i, j] = 255blockBox = cv.cvtColor(blockBox, cv.COLOR_RGBA2GRAY)##由于边界点存在光照影响,为了避免边界点对匹配的影响,进行腐蚀操作kernel = np.ones((3, 3), np.uint8)blockMask = cv.erode(blockMask, kernel, iterations=1).astype(np.float32)backgroundROI = gray_backimg[top:bottom, :]##将backgroundROI、blockBox都转化成float型blockBox = (blockBox * 1.0).astype(np.float32)backgroundROI = (backgroundROI * 1.0).astype(np.float32)##使用cv的res = cv.matchTemplate(backgroundROI, blockBox, cv.TM_CCORR_NORMED, mask=blockMask)loc = cv.minMaxLoc(res)print("loc==", loc[3][0])locs = (loc[3][0])return locs

上面代码走不通,这就是没营养的东西

2.第二种方法对比滑块和背景(成功)

# -*- coding: utf-8 -*-
"""
@Time : ${DATE} ${TIME}
@Auth : 一蓑烟雨任平生
@File :${NAME}.py
@IDE :${PRODUCT_NAME}
@Motto:ABC(Always Be Coding)"""
import cv2def FindPic(bg, huakuai):"""找出图像中最佳匹配位置:param bg: 你下载的背景图:param huakuai: 滑块的图片:return: 滑动距离"""target_rgb = cv2.imread(bg)target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)template_rgb = cv2.imread(huakuai, 0)res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)value = cv2.minMaxLoc(res)return str(value).split('(')[3].split(',')[0]

3.第二种方法增强版

## 计算距离
def FindPic(bg, huakuai):'''bg: 背景图片tp: 缺口图片'''# 读取背景图片和缺口图片bg_img = cv2.imread(bg)  # 背景图片tp_img = cv2.imread(huakuai)  # 缺口图片# 识别图片边缘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)  # 绘制矩形print(tl[0])# 返回缺口的X坐标return tl[0]

12行代码搞完不香吗?非要搞100多行代码吓唬我啊

三、模仿人为滑动破解

1.计算出速度

这里只要学着人为的开始时候加速,然后减速放进去就OK了

def get_tracks(distance, rate=0.6, t=0.2, v=0):"""将distance分割成小段的距离:param distance: 总距离:param rate: 加速减速的临界比例:param a1: 加速度:param a2: 减速度:param t: 单位时间:param t: 初始速度:return: 小段的距离集合"""tracks = []# 加速减速的临界值mid = rate * distance# 当前位移s = 0# 循环while s < distance:# 初始速度v0 = vif s < mid:a = 40else:a = -3# 计算当前t时间段走的距离s0 = v0 * t + 0.5 * a * t * t# 计算当前速度v = v0 + a * t# 四舍五入距离,因为像素没有小数tracks.append(round(s0))# 计算当前距离s += s0return tracks

2.网上失败代码不粘贴了

这里就不在列举网上那些闪电滑块,蜗牛滑块的代码了,我累了


总结

我个人原因太懒,不喜欢写代码一大堆一大堆的,只要能实现效果,越少越好,一行能解决的事情绝对不用10行,这就是我,懒人一个,烂人一个
在这里插入图片描述

这篇关于Python解决反爬机制_滑块解锁的思路以及踩的坑+心得_一蓑烟雨任平生的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/312783

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip