导读:在自动化操作某些网站的时候可能会遇到在登录账号时需要进行滑块验证的反爬机制。其中滚动滑块要求用户将图片转正,这相对于其他滑块机制来说是比较难解决的。本文将分享一个笔者关于解决这类滚动滑块的思路,希望对各位有所帮助

imagenet预训练代码(RotNet图像旋转角度预测)(1)

RotNet

这里首先要提到 GitHub 上的一个项目 RotNet。该库包含训练和测试卷积神经网络(CNNs)所需的代码,用于预测图像的旋转角度,以纠正其方向。这对于我们解决图像转正滑块十分有用,更 Nice 的是作者还提供了一些已训练好的模型,并编写了一篇 Blog 详细进行讲解,这对于机器学习领域新手来说十分友好。

// github 地址 https://github.com/d4nst/RotNet // 作者的 blog https://d4nst.github.io/

解决思路

1、将 RotNet 项目进行简化,并改造成一个 socket 服务端

这里笔者没有自己进行训练而是选择采用 RotNet 作者所提供已训练好的 rotnet_street_view_resnet50.hdf5 模型(注:该模型目前只对于房屋街道场景图片识别准确率较高)。代码则只保留了 test_street_view.py 并将其进行改造优化成一个 socket 服务端, images 文件夹则作为图片库存放验证图片。

imagenet预训练代码(RotNet图像旋转角度预测)(2)

这里需要注意一点,由于 RotNet 是四年前的项目,所以在搭建 python、 tensorflow、Keras 等环境时需要注意版本问题,版本太高需自降版本。下面是一些比较核心且需要特别注意的依赖以及对应的版本(笔者亲测可用)。

pip install --upgrade grpcio pip install --upgrade google-auth pip install tensorflow==1.13.1 pip install Keras==2.1.5 pip install h5py==2.9.0 pip install opencv-python

2、由于笔者是采用 Java selenium 进行开发,所以需要使用 Java 编写一个 Socket 客户端,用于与 RotNet 进行交互,关于 Java 如何搭建客户端这里就不做细表。

imagenet预训练代码(RotNet图像旋转角度预测)(3)

3、Selenium 获取验证图片并保存

当我们登录遇到需要将图片转正的验证时,我们需先把图片下下来。把图片下载的方式需看实际场景,如笔者所爬的网站验证图片存在在 <img> 标签的 src 中且是一个 Http URL。

imagenet预训练代码(RotNet图像旋转角度预测)(4)

因此可以通过编写代码获取 URL,并将图片下载至指定 RotNet 服务可读取的地方。(这里有可能有些网站会存在反爬机制,比如给图片加上干扰项等,这时只能采取截图的形式获取图片)。

// selenium 获取 WebElement img = driver.findElement(By.className("spinner-img")); String imageUrl = img.getAttribute("src"); String imageName = UUID.randomUUID().toString() ".png"; boolean isSuccess = ImageUtil.downloadImage(imageUrl, ImageUtil.PNG, new File(verifiPicPath imageName)); // 下载图片 public static boolean downloadImage(String imageUrl, String formatName, File localFile) { boolean isSuccess = false; URL url = null; try { url = new URL(imageUrl); isSuccess = ImageIO.write(ImageIO.read(url), formatName, localFile); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return isSuccess; }

4、客户端发起 Socket 请求让 RotNet 获取对应的图片并进行识别预测转正角度

RotNet 会响应回来图片转正的角度,如 225 表示当前图片转正需要旋转 225 度。这里我们看回到一开始那张滚动图,当我们要过验证时需要执行:鼠标点击滑块--拖动滑块--松开鼠标的动作。

imagenet预训练代码(RotNet图像旋转角度预测)(5)

通过 F12 对页面元素进行观察发现当我们移动滑块时有两个参数会变:

重点:当 RotNet 给我们返回角度时,单独只改变图片 tranfrom rotate 的属性值而不操作滑块按钮是无用的。所以我们还需计算出滑块应滑动的距离,用 Action 模拟移动滑块从而达到图片旋转。这里我通过将滑块移动到最右端,得出滑块最大移动距离为 275 px,而图片最大可旋转为 360 度。 通过计算得出旋转与移动距离比为 1.3 : 1。 这样当我们取到 RotNet 返回给我们的角度时代入公式即可得到滑块应滑动的距离。

// 模拟 鼠标点击滑块--拖动滑块--松开鼠标的动作 Actions actions = new Actions(driver); WebElement sildeBtn = driver.findElement(By.className("slider-btn")); actions.clickAndHold(sildeBtn).perform(); actions.moveByOffset(Integer.parseInt(slidingDistance), 0); Thread.sleep(1000); actions.release(sildeBtn).perform();

5、自此登录成功,之后便顺利执行其他登录后的操作。此方法笔者亲测可行,但鉴于网站的不同,可能存在一些其他的反爬机制,各位需要结合实际情况做相应的调整。

imagenet预训练代码(RotNet图像旋转角度预测)(6)

最后

以上就是笔者解决滚动滑块的思路,希望对各位有所帮助,主要是借助了 RotNet 训练好的模型(对机器学习熟悉且有条件的朋友自己训练模型更佳)进行图像预测转正获取转正所需角度,之后搭建 Socket 客户端与服务端解决跨语言通信的问题,最后使用 Selenium 完成验证操作。

感谢您的阅读,如果喜欢本文欢迎关注和转发,转载需注明出处,本头条号将坚持持续分享IT技术知识。对于文章内容有其他想法或意见建议等,欢迎提出共同讨论共同进步。

,