前言
最近因为工作需要 用selenium做了一个QQ邮箱的爬虫(登录时部分帐号要滑动解锁),先简单记录一下。
这个问题先可以分为两个部分:1.登录帐号和2.滑动解锁。python版本3.5.4
问题分析:登录+滑动解锁
其实登录账号的部分本来很简单,用selenium打开QQ邮箱官网:https://mail.qq.com 然后切换frame输入帐号
和密码点击登录即可,但是部分账号,或者可以说是异地登录的QQ账号需要滑动解锁验证码才能继续登录(下图)
看到这张图我们应该不难想到:
1、我们需要模拟人拖动按钮
2、按钮拖动的距离=拼图间的距离
这个明确了之后那接下来我们先看看拼图间的距离到底怎么算。登录虽然不难,但还是写一下,免得说我偷懒0.0
1.1 登录
运行一下 应该就能看到我们要的滑动验证码了
1.2 获取验证码图片
我们在运行完上面的代码之后验证码应该出来了,首先我们需要将其中的拼图和完整图片下载下来用于后面的距离计算。
我们先F12 然后
点击左侧的小拼图查看元素
点击大拼图查看元素
以上选中的这两张图片就是我们后面要用来计算滑动距离的图片
要获取到图片需要两步:
1、获取到图片的链接(上面已经能看到了)
2、根据链接将图片下载到本地处理
回到刚才的代码 我们需要先加个判断来识别是否出现了滑动验证码(有的时候会直接提示帐号密码错误)
只要判断这个"安全验证"的提示就可以说明是有滑动验证码的,反之没有。
这块代码写完我们基本上实现了登录和判断是否出现滑动验证码的功能,不多BB我们继续↓
出现滑动验证码的时候我们先点击刷新
此处要加入两个方法用来解决: 下载图片的问题和计算拼图还原的问题
我们先下载图片到本地 然后通过处理图片来计算拼图还原的距离
到这里图片下载的方法就ok了↑ 然后继续写计算拼图还原的方法
到这里计算拼图还原的距离的方法基本上就完成了↑
有了下载图片和计算拼图还原的方法 我们就可以直接调用get_distance方法计算拼图还原的距离
写到这里 基本上我们可以计算出拼图还原的距离了。
是不是开始看着觉得很有道理…突然看到最后两行…WTF??? distance = y * (280 / 680) - 21 是什么意思?
别着急慢慢解释…通过上面的代码已经知道了 y 就是图片还原的距离,但是我们还少考虑了2点:
1.图片的起始位置其实不是最左侧,而是向右偏移了一点
2.我们从下载到本地的图片尺寸是否跟网页上的图片尺寸一致 ? 答案当然是否定的。
我们先看一下拼图起始的位置
很清晰的能看到拼图到左边的有一段距离 那到底是多少呢 ? 我已经找人用专业的工具测过了:21左右
为了好理解 我特地用手机拍了张照片又截图下来,自己体会一下… 就是个大概的意思 为了好理解…
以上是拼图到左侧的距离 然后我们再看一下我们在本地处理并计算的图片尺寸和网页上的图片有什么区别
先看本地处理过后的图片
很明显能够看到长是680
我们再看一下网页上的…没错还是我找的人用专业工具给测的…280,笨笨的老方法帮你们理解一下
所以我们讲了这么多 会发现 :
按钮需要滑动的距离(网页) = 拼图的还原距离(本地图片) * (网页上的长度 / 本地图片的长度) -21(多出来的起始位置)
也就是前面会让人疑惑的 distance = y * (280 / 680) - 21 当然 这些都因实际情况而定
到了这一步 可以说我们最难的部分已经解决了
有了滑动距离 我们就只剩拖动按钮这一步了,先看代码
到这里按钮拖动就已经完成了,但图片分析不是人在操作毕竟有误差,所以我们需要判断滑动按钮是否已经成功,如果失败了我们得让程序继续循环去刷新验证码然后拖动直到成功为止