目前很多网页都有滑动验证,目的就是防止不良爬虫扒他们网站的数据,我这次本着学习的目的使用Java和selenium学习解决滑动验证的问题,前前后后花了一周时间(抄代码),终于成功了某音的滑动验证!
效果展示:
一、需求分析
要模拟滑动验证总共就两步:
1、找到小滑块
2、按住小滑块,滑动一段距离
第一步很简单,直接通过xPath找到,比较重要和困难的是第二步中距离的问题,我花了那么多的时间在这次学习中,主要是耗在计算需要滑动的距离。
在面向百度编程的过程中看到了很多学习资料,大体上是同一个方法:使用opencv计算机视觉工具让两张处理过的图像进行比对,从而计算出滑动的距离。
二、模拟步骤
1、使用selenium打开某音网页
直接打开
2、找到小滑块以及小滑块所在的背景图
打开前端调式工具,F12,定位小滑块和背景图的位置,复制xpath,然后用selenium查找元素
eg: driver.findElement(By.xpath("小滑块的xpath"));
3、计算小滑块需要滑动的距离
这一部分是最重要的,所以需要重点记录,学习一次,以后遇到同样的问题就能马上解决。
步骤:
1、保存小滑块图像和小滑块背景图
如图,使用selenium可以很方便的获取到这两张图片。
2、将背景图进行指定比例和区域的剪裁
在这一步中有两个比较重要的参数:
1、小滑块的top值
2、网页当前显示的图像和原图像的大小比例,在计算滑动距离需要用到
剪裁用的是 BufferedImage的getSubimage方法,一共有四个参数
image = image.getSubimage(x, y, width, height);
x和y 为截图后图片左上角的坐标值,如果x和y都是0,那么就从原图的左上角开始截起,width和height分别是截图后图片的长和宽。
在某音的滑动验证中,x设置成小滑块的宽度,y设置为小滑块的top,top也就是小滑块距离背景图上边界的像素
width设置为背景图原来的宽度-小滑块的宽度
height设置为小滑块的高度
最后截出来的图片类似这样,一定要把背景图的缺口包含进去
3、将小滑块图像二值化
从这里开始要用到opencv(开源计算机视觉库)
首先将保存的小滑块图片转灰度,然后将转灰度的下滑快二值化,二值化就是非黑即白,了解过后才知道目前很多机器识别使用的原理和这个差不多。
代码如下:
//小滑块Mat对象
Mat s_mat = Imgcodecs.imread(sFile.getPath());
// 转灰度图像
Mat s_newMat = new Mat();
Imgproc.cvtColor(s_mat, s_newMat, Imgproc.COLOR_BGR2GRAY);
// 二值化图像
binaryzation(s_newMat);binaryzation是一个方法,在源码中有
Imgcodecs.imwrite(sFile.getPath(), s_newMat);
4、将二值化的小滑块和剪裁的背景图进行比对
代码我是抄的,看不懂,就不放在这了。
我研究了好久,因为没有学习过opencv,计算过程调用的几个方法我还不是很懂,但是最后的返回值需要根据实际情况来调整,要不然验证成功率几乎为0。
4、按住小滑块并滑动
滑动过程不能让程序一步走完,不然网页会认为你是爬虫,即使