当前位置:
首页 > Python基础教程 >
-
爬虫(十二):图形验证码的识别、滑动验证码的识(3)
self.driver.find_element_by_class_name("btn-login")
login_btn.click()
sleep(3)
第一步的工作就完成了。
1.3.5 识别缺口
接下来识别缺口的位置,首先获取前后两张比对图片,二者不一致的地方即为缺口。看到网上那些案例,接收到乱序的两张图片,然后用代码拼接起来,麻烦的要死,而且我试了几个,绝大部分是不能运行的,就一个能截图出来的,截出来的图如下:
我只想登录一下,还要我干这么多事,我哭了。
所以我就换了种方法,这个版本的极验验证码应该都可以这样做,代码如下:
- def get_geetest_image(self): # 获取验证码图片
- gapimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_bg')))
- sleep(2)
- gapimg.screenshot(r'./captcha1.png')
- # 通过js代码修改标签样式 显示图片2
- js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'
- self.driver.execute_script(js)
- sleep(2)
- fullimg = self.wait.until(
- EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_slice')))
- fullimg.screenshot(r'./captcha2.png')
- def is_similar(self, image1, image2, x, y):
- '''判断两张图片 各个位置的像素是否相同
- #image1:带缺口的图片
- :param image2: 不带缺口的图片
- :param x: 位置x
- :param y: 位置y
- :return: (x,y)位置的像素是否相同
- '''
- # 获取两张图片指定位置的像素点
- pixel1 = image1.load()[x, y]
- pixel2 = image2.load()[x, y]
- # 设置一个阈值 允许有误差
- threshold = 60
- # 彩色图 每个位置的像素点有三个通道
- if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
- pixel1[2] - pixel2[2]) < threshold:
- return True
- else:
- return False
截取到的图如下:
比乱序乱序的图舒服多了,而且代码量也少。
1.3.6 模拟拖动滑块
模拟拖动过程不复杂 ,但其中的坑比较多。现在我们只需要调用拖功的相关函数将滑块拖动到对应位置。如果是匀速拖动,极验必然会识别出它是程序的操作,因为人无法做到完全匀速拖动。极验验证码利用机器学习模型,筛选此类数据为机器操作,验证码识别失败。
我们尝试分段模拟将拖动过程划分几段,前段滑块做匀加速运动,后段滑块做匀减速运动, 利用物理学的加速度公式即可完成验证。
滑块滑动的加速度用a来表示,当前速度用表示,初速度用v0表示 ,位移用x表示 ,所需时间用t表示,它们满足如下关系:
x = v0 * t +0.5 * a * t * t
v = v0 + a * t
利用这两个公式可以构造轨迹移动算法,计算出先加速后减速的运动轨迹,代码实现如下:
- def get_diff_location(self): # 获取缺口图起点
- captcha1 = Image.open('captcha1.png')
- captcha2 = Image.open('captcha2.png')
- for x in range(self.left, captcha1.size[0]): # 从左到右 x方向
- for y in range(captcha1.size[1]): # 从上到下 y方向
- if not self.is_similar(captcha1, captcha2, x, y):
- return x # 找到缺口的左侧边界 在x方向上的位置
- def get_move_track(self, gap):
- track = [] # 移动轨迹
- current = 0 # 当前位移
- # 减速阈值
- mid = gap * 4 / 5 # 前4/5段加速 后1/5段减速
- t = 0.2 # 计算间隔
- v = 0 # 初速度
- while current < gap:
- if current < mid:
- a = 5 # 加速度为+5
- else:
- a = -5 # 加速度为-5
- v0 = v # 初速度v0
- v = v0 + a * t # 当前速度
- move = v0 * t + 1 / 2 * a * t * t # 移动距离
- current += move # 当前位移
- track.append(round(move)) # 加入轨迹
- return track
- def move_slider(self, track):
- slider = self.wait.
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式