电话咨询
19922193247
有时我们频繁的爬取或者自动化模拟抓取某度数据时,会弹出旋转验证码,对于这种验证码识别也有解决措施。在网上了解别人的操作手法,学习并加以利用。
首先,运行一下自动拖动正确位置,完成识别:
对于这种验证码的解决思路,首先是获取旋转图片的地址,获取旋转图片,通过模型识别图片的旋转角度,再通过旋转角度公式计算旋转距离。最后进行模拟滑动就可以了。下面一一讲解一下。
一、获取图片角度
获取到图片的元素后,再通过模型方法获取图片的旋转角度,再获取图片按钮的宽度和滑轨距离。通过公式move_line = angle / 360 * b 计算角度对应的滑动距离。
async def auto_rotate(self):
rotImg = await self.page.querySelector('.vcode-spin-img')
while rotImg:
img_url = await (await rotImg.getProperty("src")).jsonValue()
angle = process_images(img_url)[0]
print(angle)
bottom_line = await (await (await self.page.querySelector(".vcode-spin-bottom")).getProperty("offsetWidth")).jsonValue()
button_line = await (await (await self.page.querySelector(".vcode-spin-button")).getProperty("offsetWidth")).jsonValue()
print(bottom_line)
print(button_line)
b = bottom_line - button_line
print(b)
move_line = angle / 360 * b
print(move_line)
二、模拟拖到
获取到角度信息后,接下来就是模拟拖到了。将拖到距离分为两部分,第一部分匀加速,第二部分匀减速。一直拖动到目标角度距离。
async def try_validation(self, distance=308):
distance1 = distance - 10
distance2 = 10
btn_position = await self.page.evaluate('''
() =>{
return {
x: document.querySelector('.vcode-spin-button').getBoundingClientRect().x,
y: document.querySelector('.vcode-spin-button').getBoundingClientRect().y,
width: document.querySelector('.vcode-spin-button').getBoundingClientRect().width,
height: document.querySelector('.vcode-spin-button').getBoundingClientRect().height
}}
''')
x = btn_position['x'] + btn_position['width'] / 2
y = btn_position['y'] + btn_position['height'] / 2
# print(btn_position)
await self.page.mouse.move(x, y)
await self.page.mouse.down()
await self.page.mouse.move(x + distance1, y, {'steps': 30})
await self.page.waitFor(800)
await self.page.mouse.move(x + distance1 + distance2, y, {'steps': 20})
await self.page.waitFor(800)
await self.page.mouse.up()
最后运行主函数完成拖动
具体识别思路,可参考某大神的解决方案,本人也是在他的基础下,完成旋转验证码的拖动,不过就识别准确率上来说,总体上来说还行吧。详细请参考:
https://blog.csdn.net/Laozizuiku/article/details/106645583?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=4
温馨提示:我们将在您提交信息后的30分钟内与您取得联系,请您保持电话通畅,谢谢!