简述
在使用 Selenium 抓取数据的时候,遇到了滑动验证码,找了下相关资料,发现一篇博客正是想要的,非常感谢原作者。不过经试验,原文的成功率达不到需求,主要原因是模拟鼠标移动的轨迹不够理想。于是针对鼠标轨迹模拟部分进行改进,使成功率达到了 80% 左右,满足了实际使用的需求。
模拟验证过程
- 加载验证码页面
- 获取背景图片和缺口图片
- 根据两张图片的差异计算出平移距离
- 模拟鼠标移动,移动滑块到目标位置
- 完成验证
其中背景图片和缺口图片需要拼接还原才能得到原图。
鼠标移动轨迹优化
滑动验证码主要是通过滑动轨迹来区分人和机器,所以模拟移动的轨迹就是关键部分。越接近人类滑动的轨迹,成功率就越高。那么最真实的轨迹就是采集真实用户的鼠标轨迹,然后还原出来。
轨迹采集
轨迹采集使用 GhostMouse 这款软件,可以将采集的轨迹保存成脚本文件,文件的格式大概是这样子的:
1 | {Delay 0.45} |
轨迹转化
有了真实的轨迹之后,需要抽象转化为 Java 对象,方便还原。轨迹主要的动作有四个:按下、释放、移动、延时,移动动作的绝对坐标转换为相对上个位置的偏移坐标,使用 MouseTrack 表示一次动作。
MouseTrack.java:
1 | /** |
读取保存的轨迹文件:
1 | public class MouseTrackManager { |
轨迹还原
有了轨迹的相关数据之后,就可以对轨迹进行还原了。
获取轨迹
根据目标位移距离,选择一个最接近的轨迹来还原。
1 | /** |
执行轨迹动作
一个轨迹是一系列动作的列表,依次执行每个动作就可以还原出来了。
1 | private void moveWithMouseTrack(WebDriver driver, WebElement element, int distance) |
有个地方需要注意一下,由于延时这个动作使用 Thread.sleep() 实现,但是这个方法是有误差的,而且执行次数较多,累计起来的误差就会较大,导致移动速度比原来的慢。所以对于延时这个动作,忽略掉延时时间太短,以加快整个动作的流畅性。
最终效果图
无图无真相,上图!

源码
源码,是没有的,自己写吧。不要像我这样那么懒。