python爬虫滑动验证码,python 爬虫模拟登陆,破解滑块验证码
本文介绍了python自动破解滑动验证码的解决方案,并通过实例代码进行了详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。
在Web自动化测试过程中,我们经常被登录验证码卡住,不知道验证码怎么过。
一般情况下,我们遇到验证码,可以找开发帮忙解决,关闭验证码,或者给一个通用的验证码!
那么如果开发没有帮助,我们有什么办法处理这些验证码呢?
当然,答案是肯定的。常见的验证码一般分为两类,一类是图形验证码,一类是滑动验证码!
滑动验证破解思路
一般来说,破解滑动验证码的思路是以下两步:
1.获取滑块的滑动距离。2.模拟拖动滑块,通过验证。关于这个滑动验证码,滑块和缺口背景是分开的图像,我们可以把这两个图像,
下载它借助图像识别技术识别背景图像中缺口的位置,然后减去滑块的当前位置得到滑动的距离。
案例讲解
事不宜迟,我们先来看一个案例(QQ空间登录)。实现QQ空间登录案例的步骤如下:
1.创建驱动对象,访问qq登录页面2,输入账号密码3,点击登录4,模拟滑动验证
实现代码
。导入时间
从selenium导入web驱动程序
从slideVerfication导入slideVerfication代码
# 1.创建一个驱动程序对象并访问qq登录页面。
浏览器=webdriver。铬合金()
browser . get( https://qzone . QQ.com/)
# 2.输入帐户密码。
# 2.0单击切换到登录的iframe
browser . switch _ to . frame( log in _ frame )
# 2.1点击账户密码登录
browser . find _ element _ by _ id( switcher _ plogin )。单击()
# 2.2找到账号输入框,输入账号。
browser.find_element_by_id(u )。发送键( 123456 )
# 2.3位置密码输入输入密码
browser.find_element_by_id(p )。send_keys(PYTHON )
# 3.单击登录
browser . find _ element _ by _ id( log in _ button )。单击()
时间.睡眠(3)
# 4.模拟滑动验证
# 4.1切换到滑动验证码的iframe
tcaptcha=browser . find _ element _ by _ id( tcaptcha _ iframe )
browser . switch _ to . frame(tcaptcha)
# 4.2获取滑动相关元素
#选择拖动滑块的节点。
slide _ element=browser . find _ element _ by _ id( tcaptcha _ drag _ thumb )
#获取滑块图片的节点
slide block _ ele=browser . find _ element _ by _ id( slide block )
#获取凹口背景图片节点
slide BG=browser . find _ element _ by _ id( slide BG )
# 4.3计算滑动距离
sc=SlideVerificationCode(save _ image=True)
距离=sc . get _ element _ slide _ distance(slide block _ ele,slideBg)
#滑动距离误差修正,滑动距离*网页上显示的图片的缩放比例-滑块的相对初始位置
距离=距离*(280/680) - 22
打印(“校正滑动距离”,距离)
# 4.4,滑。
sc.slide_verification(浏览器,slide_element,distance=100)
操作效果:
实际上,该模块的图像识别是在第三方图像处理模块的帮助下进行的。python中有很多现成的处理图像的库,本文使用opencv-python进行识别。上面在slideVerfication模块中使用的两种方法的一些参考代码如下:
根据传入滑块,和背景的节点,计算滑块的距离
def get _ element _ slide _ distance(self,sli
der_ele, background_ele, correct=0):
"""
根据传入滑块,和背景的节点,计算滑块的距离
该方法只能计算 滑块和背景图都是一张完整图片的场景,
如果背景图是通过多张小图拼接起来的背景图,
该方法不适用,请使用get_image_slide_distance这个方法
:param slider_ele: 滑块图片的节点
:type slider_ele: WebElement
:param background_ele: 背景图的节点
:type background_ele:WebElement
:param correct:滑块缺口截图的修正值,默认为0,调试截图是否正确的情况下才会用
:type: int
:return: 背景图缺口位置的X轴坐标位置(缺口图片左边界位置)
"""
# 获取验证码的图片
slider_url = slider_ele.get_attribute("src")
background_url = background_ele.get_attribute("src")
# 下载验证码背景图,滑动图片
slider = "slider.jpg"
background = "background.jpg"
self.onload_save_img(slider_url, slider)
self.onload_save_img(background_url, background)
# 读取进行色度图片,转换为numpy中的数组类型数据,
slider_pic = cv2.imread(slider, 0)
background_pic = cv2.imread(background, 0)
# 获取缺口图数组的形状 -->缺口图的宽和高
width, height = slider_pic.shape[::-1]
# 将处理之后的图片另存
slider01 = "slider01.jpg"
background_01 = "background01.jpg"
cv2.imwrite(background_01, background_pic)
cv2.imwrite(slider01, slider_pic)
# 读取另存的滑块图
slider_pic = cv2.imread(slider01)
# 进行色彩转换
slider_pic = cv2.cvtColor(slider_pic, cv2.COLOR_BGR2GRAY)
# 获取色差的绝对值
slider_pic = abs(255 - slider_pic)
# 保存图片
cv2.imwrite(slider01, slider_pic)
# 读取滑块
slider_pic = cv2.imread(slider01)
# 读取背景图
background_pic = cv2.imread(background_01)
# 比较两张图的重叠区域
result = cv2.matchTemplate(slider_pic, background_pic, cv2.TM_CCOEFF_NORMED)
# 获取图片的缺口位置
top, left = np.unravel_index(result.argmax(), result.shape)
# 背景图中的图片缺口坐标位置
print("当前滑块的缺口位置:", (left, top, left + width, top + height))
return left
滑动滑块进行验证
def slide_verification(self, driver, slide_element, distance):"""
滑动滑块进行验证
:param driver: driver对象
:type driver:webdriver.Chrome
:param slide_element: 滑块的元组
:type slider_ele: WebElement
:param distance: 滑动的距离
:type: int
:return:
"""
# 获取滑动前页面的url地址
start_url = driver.current_url
print("需要滑动的距离为:", distance)
# 根据滑动距离生成滑动轨迹
locus = self.get_slide_locus(distance)
print("生成的滑动轨迹为:{},轨迹的距离之和为{}".format(locus, distance))
# 按下鼠标左键
ActionChains(driver).click_and_hold(slide_element).perform()
time.sleep(0.5)
# 遍历轨迹进行滑动
for loc in locus:
time.sleep(0.01)
ActionChains(driver).move_by_offset(loc, random.randint(-5, 5)).perform()
ActionChains(driver).context_click(slide_element)
# 释放鼠标
ActionChains(driver).release(on_element=slide_element).perform()
到此这篇关于python实现破解滑动验证码的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。