如何通过偷懒的方式实现滑动验证?
1、概述 在自动测试化或者是爬取数据过程当中,通过selenium去对浏览器页面进行操作时,会遇到很多的验证方式,这是因为现在的大部分的网站以及服务端都会加一个反扒机制,以防止恶意的数据爬取和对网站的攻击。
2、常见的滑动验证 常见的验证码一般是有手机号验证,验证码识别,图像识别,滑动验证等等,验证码以及图像识别暂时没有办法用简单的方法去实现自动验证,需要借助一些工具和特别的图像识别技术去做处理。哪这篇文章就针对滑动验证码以一种偷懒的方法去解决它!
3、环境准备 浏览器:Chrome 浏览器 浏览器驱动:Webdriver(要和浏览器的版本保持一致) 在Pycharm中pip install selenium回车即可 我们以QQ邮箱的滑动验证为例
接下来可以愉快的编写代码了
第一步---要获取浏览器驱动。这个是你浏览器驱动的保存位置(还有一种方式就是直接放在环境变量里面---不建议)
第二步---我们需要对操作步骤的元素进行定位操作,通常情况下,通过xpath和id就可以定位到元素。例如
值得注意的是,QQ邮箱里面有好几个iframe,我们对里面的元素进行操作时,必须进入iframe里面才可以对元素进行操作。
driver.switch_to.frame('ptlogin_iframe') 这样我们就可以对iframe中的元素进行操作啦! 如果有多层需要逐层进入。
第三步---操作完登录所需的步骤之后我们就来到了滑动验证界面
经过我的反复试错,我惊奇的发现,这种验证码的位置和滑动距离是固定的,于是我就产生了一种暴力的想法。通过js的操作去移动滑块到指定位置。嘿嘿嘿你猜怎么着?它根本动不了!!!然后我就想是不是可以用 ActionChains 这个类去模拟鼠标操作呢?说时迟那时快,哐哐哐敲完!Run! OHHHHHHHHHHH它动了。但是没有完全动,它只是浅浅的点击了一下滑块。
于是,好胜心又驱动我去研究了一番,发现这个滑块元素并不能直接的去点击操作它,更不能移动。通俗一点讲就是说我们看见的这个滑块只是产生移动滑块的入口,当我们鼠标去点击的时候会产生一个新的元素去移动,这个时候才是我们可以去操作的元素。
于是我们不能直接用selenium中的ActionChains 去操作元素了。你不行!总有人可以!我们换一个 pyautogui这个类去操作。
直接一波导入(有关pyautogui的官方说明点击此链接查看哈 PyAutoGUI · PyPI)
代码来!
现在我们就可以自动的去操作滑动验证啦!!! 额 因为gif转换工具用不了了我也不知道为什么,所以就没办法展示结果。还有就是如果自己去调试的话,最好将浏览器的Debug模式打开,浏览器才会跳过对selenium的识别。当然也有他的方法可以去做。下一期会给大家分享一下如何运用OpenCV+selenium去实现更高级的滑动验证。今天的分享就到这里啦,感谢大家!!!
代码仅供参考,有不对的地方欢迎大家指正,共同进步! import time from selenium import webdriver from selenium.webdriver import ActionChains from pywinauto.keyboard import send_keys user='569898740' pwd='*****'
driver = webdriver.Chrome(r"D:\webdriver\chromedriver.exe")
driver.get(url="https://y.qq.com/") driver.maximize_window()
#点击登录按钮 driver.find_element_by_xpath('//a[@class="top_login__link"]').click() time.sleep(3) driver.switch_to.frame('ptlogin_iframe') time.sleep(3)
#点击账号密码登录 driver.find_element_by_id('switcher_plogin').click()
#driver.switch_to.frame("login_frame") time.sleep(2)
输入帐号 将user填入id是u的输入框
driver.find_element_by_id("u").clear() driver.find_element_by_id("u").send_keys(user) time.sleep(1)
输入密码 将pwd填入id是p的输入框
driver.find_element_by_id("p").clear() driver.find_element_by_id("p").send_keys(pwd) time.sleep(1)
点击登录 登录按钮的id是login_button
driver.find_element_by_id("login_button").click() time.sleep(5) driver.switch_to.frame('tcaptcha_iframe') time.sleep(3)
#获取滑块背景大小
background_size = driver.find_element_by_id("slideBlock").size
#191-22=169
#获取滑块按钮的起始位置 slide_block = driver.find_element_by_id("slideBlock") start_location = slide_block.location print(start_location)
#滑块的滑动范围[开始位置的横坐标加上滑片的宽度],由于是平移所以纵坐标没有变化
#start_location["x"] + background_size["width"] x_location = 170 y_location = start_location["y"] print(x_location,y_location) action_movie = ActionChains(driver) action_movie.click_and_hold(slide_block) action_movie.drag_and_drop_by_offset(slide_block,x_location,y_location).perform() time.sleep(10)