Python+Selenium爬虫之动态验证码的处理

2023-11-19

目录

1.拖动下方滑块完成拼图(单独图片)

2.拖动下方滑块完成拼图(共同图片)


可拖动验证码分为空缺区域为单独的图片和空缺区域与背景图片为一个共同图片,所以实现方式有2种。

1.拖动下方滑块完成拼图(单独图片)

拖动验证码
  1. 实现原理: 查看空缺区域图片到左侧端点的距离d1,再次查看裁剪图片到左侧端点的距离d2,d1-d2的距离就是滑块拖动的距离。
  2. 实现方式:

1.获取图片验证码滑动区域的距离

def deal_verificationcode():
	s = Service("/usr/bin/chromedriver")
	options = webdriver.ChromeOptions()
	options.add_experimental_option('excludeSwitches', ['enable-automation'])
	options.add_argument('--headless')
	options.add_argument('--no-sandbox')
	global driver
	driver = webdriver.Chrome(service=s, options=options)
	driver.get(url)
	driver.find_element(by=By.TAG_NAME, value='textarea').send_keys(key)
	button = driver.find_element(by=By.XPATH, value='//*[@id="goodstrackText"]/div[1]/div[2]/div[1]/div/button')
	driver.execute_script("$(arguments[0]).click()", button)

	sleep(1)
	# 裁剪图片距离左侧位置
	left_distance1 = driver.find_element(By.ID, value='grap_cut').value_of_css_property('left')
	# 空缺区域距离左侧位置
	left_distance2 = driver.find_element(By.ID, value='grap_vacant').value_of_css_property('left')
	distance = float(left_distance2.split("px")[0]) - float(left_distance1.split("px")[0]) - float(10)

	run_slidingblock(distance)

2.距离获取后,拖动验证码

def run_slidingblock(distance):
	tracks = get_tracks(distance)
	num = 0
	for i in tracks:
		num += i
	if distance - 2 < num and num < distance + 2:
		track = tracks
	else:
		a = distance - num
		tracks.append(a)
		track = tracks
	drag = driver.find_element(by=By.ID, value='swipper-btn')
	ActionChains(driver).click_and_hold(drag).perform()
	for x in track:
		ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
	ActionChains(driver).release().perform()

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 = v
		if s < mid:
			a = 40
		else:
			a = -3
		# 计算当前t时间段走的距离
		s0 = v0 * t + 0.5 * a * t * t
		# 计算当前速度
		v = v0 + a * t
		# 四舍五入距离,因为像素没有小数
		tracks.append(round(s0))
		# 计算当前距离
		s += s0
	return tracks

2.拖动下方滑块完成拼图(共同图片)

拖动验证码
  1. 实现原理: 计算背景图片中空缺区域到左侧端点的距离d1,再次查看裁剪图片到左侧端点的距离d2,d1-d2的距离就是滑块拖动的距离。
  2. 实现方式:

1.计算背景图片中空缺区域到左侧端点的距离

def deal_verificationcode():
	s = Service("/usr/bin/chromedriver")
	options = webdriver.ChromeOptions()
	options.add_experimental_option('excludeSwitches', ['enable-automation'])
	options.add_argument('--headless')
	options.add_argument('--no-sandbox')
	global driver
	driver = webdriver.Chrome(service=s, options=options)
	driver.get(url)
	sleep(1)
	driver.switch_to.frame('tcaptcha_iframe')
	get_img('cdn1')
	get_img('cdn2')
	x = FindPic('cdn1.jpg', 'cdn2.jpg')

	left_distance1 = driver.find_element(By.ID, value='slideBlock').value_of_css_property('left')
	log.info('验证码距离左侧距离为:' + str(left_distance1))
    distance = x - float(left_distance1.split("px")[0])
    
    run_slidingblock(distance)

2.距离获取后,拖动验证码

def run_slidingblock(distance):
	tracks = get_tracks(distance)
	num = 0
	for i in tracks:
		num += i
	if distance - 2 < num and num < distance + 2:
		track = tracks
	else:
		a = distance - num
		tracks.append(a)
		track = tracks
	drag = driver.find_element(by=By.ID, value='swipper-btn')
	ActionChains(driver).click_and_hold(drag).perform()
	for x in track:
		ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()
	ActionChains(driver).release().perform()

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 = v
		if s < mid:
			a = 40
		else:
			a = -3
		# 计算当前t时间段走的距离
		s0 = v0 * t + 0.5 * a * t * t
		# 计算当前速度
		v = v0 + a * t
		# 四舍五入距离,因为像素没有小数
		tracks.append(round(s0))
		# 计算当前距离
		s += s0
	return tracks

所谓的人生开挂,不过是厚积薄发! 欢迎评论和转载!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python+Selenium爬虫之动态验证码的处理 的相关文章

随机推荐

  • 云函数部署之网易云

    云函数部署之网易云 云函数 什么是云函数 就是可以让你没有服务器 本地电脑不用下载Python也可以使用这个项目 而且还是白嫖 既解决了很多人部署的麻烦 也给了那些被劝退的朋友回来的勇气 十分钟便可以全部弄完 1 进入云函数 这里拿腾讯云的
  • caffe im2col 详解

    caffe im2col详解 本文讲解的是caffe中卷积过程 众所周知caffe中卷积采用的是im2col和sgemm的方式 网上已经有很多的im2col的讲解 原本不打算写这篇文章 在此不得不吐槽下 网上有不少的讲解caffe im2c
  • redis缓存雪崩、穿透、击穿

    这篇文章我们来了解一下一些redis的高并发问题以及他的解决方法 上图是一个简单的数据查询流程 前台请求 后台先从缓存中取数据 取到直接返回结果 取不到时从数据库中取 数据库取到更新缓存 并返回结果 数据库也没取到 那直接返回空结果 一 r
  • CentOs8 安装 Mysql 8 步骤及问题解决

    1 Mysql数据库采用的版本是Mysql8 在Mysql官方网站 MySQL 下载Mysql安装包 2 安装新版mysql之前 我们需要将系统自带的mariadb lib卸载 执行命令 rpm qa grep mariadb 若检查出系统
  • sql数据库查询

    sql数据库查询要点 查询 在GROUP BY 的后面使用 HAVING指定筛选条件 select from 表 group by 分组条件 having 筛选条件 内连接INNER JOIN 只返回符合条件的值 SELECT FROM t
  • IntelliJ IDEA中如何使用JUnit4

    背景 最近参与了一个Anroid医疗项目 其中项目底层有很多基础类及通讯类 而且很多涉及复杂的字节操作还有多线程同步及状态机处理 这样的项目做一下TDD还是必要的 尽量项目前期把风险降低一些 现在的问题是本人使用的是IntelliJ开发的A
  • 【JavaScript 逆向】猿人学 web 第十八题:jsvmp,洞察先机

    案例目标 网址 第十八题 jsvmp 洞察先机 猿人学 本题目标 抓取 5 页数字 计算加和并提交结果 常规 JavaScript 逆向思路 一般情况下 JavaScript 逆向分为三步 寻找入口 逆向在大部分情况下就是找一些加密参数到底
  • 2019 icpc西安邀请赛 点分治

    https nanti jisuanke com t 39277 求 sum 异或和为0的路径 被其他路径包含的次数 如果只是求异或和为0的路径数量 其实是裸点分治 但是加上要求之后 就会复杂一些 进行分类讨论 再特殊处理根节点就行 由于信
  • Unraid使用记录:使用Docker与虚拟机

    文章目录 前言 使用Docker 使用示例 相关说明 使用虚拟机 使用示例 相关说明 硬件直通 后记 前言 Unraid本身功能挺少的 很多功能都是要通过插件 Docker和虚拟机来实现的 Docker可以简单的实现各种丰富的功能 而虚拟机
  • 群晖DS Video(Station)自动同步视频简介和海报(最新官方解决方案)

    目录 一 前言 二 前提 三 实现 1 注册The Movie Database账号 2 创建API 3 修改群辉Hosts A 在群辉中开启SSH的访问 B 然后通过ssh命令登录到群辉后台 C 通过sudo i指令切换到root用户指令
  • python的循环控制结构_Python的控制结构之For、While、If循环问题

    传统Python语言的主要控制结构是for循环 然而 需要注意的是for循环在Pandas中不常用 因此Python中for循环的有效执行并不适用于Pandas模式 一些常见控制结构如下 for循环 while循环 if else语句 tr
  • 【建议收藏!】APP UI自动化测试,思路全总结在这里了。

    首先想要说明一下 APP自动化测试可能很多公司不用 但也是大部分自动化测试工程师 高级测试工程师岗位招聘信息上要求的 所以为了更好的待遇 我们还是需要花时间去掌握的 毕竟谁也不会跟钱过不去 接下来 一起总结一下APP UI自动化测试的思路吧
  • 再论人与人的三大关系:生存关系、性关系和经济关系

    黄仁宇在 关系 一文中认为 人类的各种关系之中 以生存的关系 性关系和经济关系最为重要 理想上的工作协作和团队精神 已经不存在 俺做过的几个规模在50人以下的 这说明两个问题 1 小公司的目的不是发展而是不死 然后赚钱 也就是这是一笔买卖而
  • exe4j打包exe_JDK11及以后版本在Win下的打包发布方法

    概述 我在准备使用高版本jdk后 遇到的最麻烦的问题就是打包发布了 主要原因还是jdk的模块化带来的 在经历了长时间折腾后 终于成功完成了这个 当然 只是针对window下的 想要使用高版本jdk打包发布Windows应用 需要准备 exe
  • js中的对象 函数 原型

    关于 Function Object 和 proto prototype 1 每一个对象实例都有一个 proto 属性 这个属性就是指向 对象构造函数的原型 let b new Function console log b proto Fu
  • 【Matlab图片剪裁】

    标题Matlab剪裁图片 提取感兴趣部分 问题描述 当需要从一幅图片中提取一些感兴趣的内容时 比如一些细小的文字 图案等 如果从整个图片中直接提取 必然会大大增加计算量 导致处理时间很长 而且多数计算都是无效计算 进而非常消耗资源 解决办法
  • impala 错误

    问题一 impala state store unrecognized service 原因 当前节点未成功安装impala server impala state store impala catalog 解决方案 yum install
  • Qt生成log日志文件

    摘要 本文在Qt程序中实现了日志功能 读者可以在此基础上进一步创作和拓展 介绍 系统日志一般指存放系统重要运行信息的log txt文件 主要作用有两个 1 记录系统重要的运行信息 2 当系统突然崩溃时 可以根据日志来跟踪和定位程序错误 Qt
  • 常见CAD/CAM控件大全

    前言 CAD CAM 计算机辅助设计与制造 技术是随着计算机和数字化信息技术发展而形成的新技术 是20世纪最杰出的工程成就之一 也是数字化 信息化制造技术的基础 其发展和应用对制造业产生了巨大的影响和推动作用 经过几十年的发展和应用 不仅C
  • Python+Selenium爬虫之动态验证码的处理

    目录 1 拖动下方滑块完成拼图 单独图片 2 拖动下方滑块完成拼图 共同图片 可拖动验证码分为空缺区域为单独的图片和空缺区域与背景图片为一个共同图片 所以实现方式有2种 1 拖动下方滑块完成拼图 单独图片 拖动验证码 实现原理 查看空缺区域