前言

在爬取数据中,不可避免的会遇到各种验证,上一篇文章说了二维码验证的办法

示例

本篇文章讲的是遇到滑块验证的解决方案,本例是在一个b2b的网站内遇到的滑块验证

重点

真实人的拖动操作,是y轴和x都有变化的。这是重中之重。

思路

保存完整图片和缺口图片

找到缺口和图片的距离

生成移动轨迹

松开鼠标,确定移动结果

保存(完整和缺口)图片的代码:

def get_code_image(driver, fiel_name, ele_name='token-img', is_by_id=True):

if is_by_id is True:

code_element = driver.find_element_by_id(ele_name)

else:

code_element = driver.find_element_by_css_selector(ele_name)

code_element.location_once_scrolled_into_view

driver.save_screenshot(fiel_name)

left = code_element.location_once_scrolled_into_view['x']

top = code_element.location_once_scrolled_into_view['y']

right = code_element.size['width'] + left

height = code_element.size['height'] + top

im = Image.open(fiel_name)

img = im.crop((left, top, right, height)) # 截取指定元素图片保存

save_res = img.save(fiel_name)

return save_res

处理缺口和完整图片需要设置页面元素的展示和隐藏不同页面操作不同,本例使用的是执行js控制页面元素。

js_code = """

var x = document.getElementsByClassName('gt_slice')[0].style.display="none";

console.log(x)

"""

# 执行js代码

self.browser.execute_script(js_code)

找缺口距离的代码

def get_distance(cut_image, full_image):

cut_image = Image.open(cut_image) # 缺口背景图

full_image = Image.open(full_image) # 完整背景图

threshold = 86 # 灰度值正好为86,86,86 这个是透明度的差值,边界值像素的RGB中的B值为准

for i in range(55, cut_image.size[0]): # 75为滑块的截图最右边阴影到图片最左端的长度

for j in range(0, cut_image.size[1]):

pixel1 = cut_image.getpixel((i, j))

pixel2 = full_image.getpixel((i, j))

res_R = abs(pixel1[0] - pixel2[0]) # 计算RGB差

res_G = abs(pixel1[1] - pixel2[1]) # 计算RGB差

res_B = abs(pixel1[2] - pixel2[2]) # 计算RGB差

if res_R > threshold and res_G > threshold and res_B > threshold:

print(i-7)

return i-7

return 0

根据距离计算出拖动的弧度

def get_stacks(distance):

distance+5

'''

拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速

变速运动基本公式:

① v=v0+at 匀加速\减速运行

② s=v0t+½at² 位移

③ v²-v0²=2as

'''

# 初速度

v0 = 0

# 加减速度列表

a_list = [50, 65, 80]

# 时间

t = 0.4

# 初始位置

s = 0

# 向前滑动轨迹

forward_stacks = []

mid = distance * 3 / 5

while s < distance:

if s < mid:

a = a_list[random.randint(0, 2)]

else:

a = -a_list[random.randint(0, 2)]

v = v0

stack = v * t + 0.5 * a * (t ** 2)

# 每次拿到的位移

stack = round(stack)

if (s + stack) > distance:

stack = distance - s + 5

s += stack

v0 = v + a * t

forward_stacks.append(stack)

back_stacks = [-5,]

print(forward_stacks)

return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks}

重点

接下来是拖动要真实模拟人的操作,不可能y轴不变,这是重中之重。

n= 0

for forward_stack in forward_stacks:

ActionChains(self.browser).move_by_offset(xoffset=forward_stack, yoffset=n).perform()

n += 1 + random.randint(1, 2)

time.sleep(0.5)

for back_stack in back_stacks:

ActionChains(self.browser).move_by_offset(xoffset=back_stack, yoffset=n).perform()

time.sleep(0.01)

time.sleep(0.5)

n += 1 + random.randint(1, 2)

yoffset=n

这两行是重点,很多文章中没有介绍。

原文链接:https://blog.csdn.net/Ben_zp/article/details/106995826

python弹出滑块怎么验证_selenium 处理滑块验证的重点相关推荐

  1. 弹出框页面中使用jquery.validate验证控件

    弹出框页面中使用jquery.validate验证控件有几个问题需要解决: 1,弹出框的提交事件完成后如何关闭弹出框页面? 2,提交不成功如何返回当前页? 3,如果知道验证事件成功? 之前笔者都是JS ...

  2. 解决win10 cmd下运行python弹出windows应用商店问题

    解决win10 cmd下运行python弹出windows应用商店问题 问题描述: ​ win10系统下,环境变量已配置,然而在cmd下或powershell下运行python,均弹出应用商店,不能正 ...

  3. win10系统cmd模式下输入python弹出Windows应用商店 解决方法

    win10系统cmd模式下输入python弹出Windows应用商店 解决方法 解决方法1: 打开环境变量设置[此电脑->属性->高级系统设置->环境变量] 在变量Path中发现有% ...

  4. 【Python】关于Python弹出Invalid SDK Permission Denied问题的解决

    [Python]关于Python弹出Invalid SDK Permission Denied问题的解决 背景:本人今天在电脑上安装了Pycharm IDE,但是却总是弹出Invalid Python ...

  5. cmd输入python弹出应用商店

    如果cmd输入python弹出应用商店,环境变量没问题,只需要把这两个关掉即可. https://blog.csdn.net/qq_43706426/article/details/104347702 ...

  6. python弹出警告框_selenium+webdriver+python 中警告框的处理方法

    在自动化测试过程中,经常会遇到弹出警告框的情况,如图所示: 在 WebDriver 中处理 JavaScript 所生成的 alert.confirm 以及 prompt 是很简单的.具体做法是使用 ...

  7. 三种方法 彻底解决win10 cmd下运行python弹出windows应用商店

    在已经通过python官网安装完成python后,命令行输入python,会弹出微软应用商店. 方法一:下移微软商店的环境变量 首先可以将环境变量中的 C:\Users\Marvin\AppData\ ...

  8. python 弹出对话框_python+selenium 抓取弹出对话框信息

    抓取弹出对话框信息,困挠了我很久,我百度了很久,一直没有找到我想要的内容.最近学习到了. 有两种方法: 1.driver.switch_to.alert.text 2.result = EC.aler ...

  9. python弹出输入框_Python实现使用tkinter弹出输入框输入数字, 具有确定输入和清除功能...

    Python3.6中用tkinter, 弹出可以输入数字的输入框. # Copyright (c) 2017-7-21 ZhengPeng All rights reserved. def pop_u ...

  10. python 弹出窗口闪烁,Python PyQt5中弹出子窗口解决子窗口一闪而过的问题

    方式一:槽函数中创建子窗口对象,赋值到普通变量 在主窗口添加按钮,并把按钮信号关联槽,在槽函数中创建子窗口对象赋值到普通变量,并调用其 show 方法. from PyQt5.QtWidgets im ...

最新文章

  1. jmap 文件解析_使用jmap dump出来的java堆镜像文件,可以用什么打开做详细分析
  2. 联机装箱问题 java_Java实现 洛谷 P1049 装箱问题
  3. Strings.Replace 方法的注意事项
  4. mac:在当前文件夹打开terminal终端
  5. Pandas dataframe列名重命名
  6. linux系统可以装win10吗,如何在Win10专业版中安装Linux系统?
  7. angularJs service
  8. 面向对象---特----性
  9. 解决Adobe Flash Player已不再受支持的问题
  10. 有赞.测试团队介绍(转)
  11. windows 7 UEFI 启动模式安装,解决win7 64 setup会提示GPT分区不支持的问题
  12. Viso跨职能流程图连接点操作
  13. 东野圭吾梦幻花读后感_东野圭吾《梦幻花》读书笔记
  14. 漫画 | 程序员才是真正的“甩锅”大师!
  15. QTabWidget自定义,拖入拖出Tab页的简易实现
  16. 黑猫带你学eMMC协议第11篇:eMMC擦除详解(erase/trim/discard/sanitize/secure erase/secure trim...)
  17. POI推荐文献阅读笔记3:Predicting Human Mobility via Graph Convolutional Dual-attentive Networks
  18. 计算机服务器数量指的是什么意思,pc服务器是指什么意思
  19. 【观察】操作系统产业峰会2021:立足新起点,迈上新征程
  20. 计算机原理个人总结,计算机教学个人年终总结

热门文章

  1. java编码格式的转换以及乱码恢复
  2. 分布式文件系统KFS
  3. ContextCapture User Guide V4.4.11 Home(Smart3D 帮助文档 目录)
  4. 对话 Do Kwon :流亡、谎言和梦醒时分的懊悔
  5. IBM V系列存储常用命令
  6. 两点定标法_PH计两点校准法
  7. 小白入门Linux学习日志
  8. win10:笔记本设置风扇转速
  9. python绘制地图的第三方库_10个用于GIS和地图绘制的Python库
  10. freetype2 使用