验证码作为自然人机器人的判别工具,广泛应用于各种场景,防止程序被自动化。在传统的字符验证安全已经名存实亡的情况下,各种新的验证码如雨后春笋般出现。今天我想和大家分享一个滑块验证码的Python实现。
目录
初级版滑块拼图验证码补充知识点高级版滑块拼图验证码可以看作是滑块验证码的高级版,其验证机制相对复杂。本节将介绍两种幻灯片拼图验证码:初级版和高级版。
初级版滑块拼图验证码
滑动拼图验证码初级版本在普通滑块验证码的基础上增加了随机滑动距离,用户需要根据拼图的缝隙位置来决定滑块的滑动位置。下图显示了滑块拼图验证码的初始状态。注意,谜题和缺口还没有显示出来。点击滑块后,会出现拼图和缺口,如下右图所示。然后,该特征将被用于找到谜题和缺口的位置。
让我们开始写代码。首先用硒打开网页。代码如下:
从selenium导入web驱动程序
浏览器=webdriver。铬合金()
URL=r ' d:\ works \ python _ crawl 1 \ 《Python爬虫(进阶与进通)》代码摘要\2。验证码防爬\4。'滑动拼图验证码\基础滑动拼图验证码\index.html '
Browser.get(url) #用模拟浏览器打开网页
然后定位滑块,模拟点击滑块,使拼图和缺口出现。虽然此时点击滑块会显示验证失败,但这是为了帮助我们得到拼图的真实位置和差距,以计算滑块需要滑动的距离。代码如下:
slider=browser . find _ element _ by _ XPath('/*[@ id=' slide BTN ']')#定位滑块
Slider.click() #模拟单击滑块使拼图和缺口出现。
Time.sleep(3) #等待3秒
然后你需要找到缺口的位置。滑动拼图验证码的初级版本可以直接在网页的源代码中找到。如下图,用元素定位工具选中凹口,在网页源代码中查看凹口的左属性值,即凹口左边缘到整张图片左边缘的距离,这里是135个像素。
如下图,用同样的方法查看拼图的左属性值,即从拼图的左边界到整张图片左边界的距离,这里是2个像素。
因为拼图的初始左属性值总是2个像素,所以只需要提取gap的左属性值。这里使用正则表达式进行提取,代码如下:
进口re
Data=browser.page_source #获取网页源代码
' div class='slide-box-shadow '。*?左:(。*?)px' #写正则表达式
Qk _ left=re.findall (p _ qk,data,re.s) #提取gap的左属性值。
获取qk_left如下:
减去gap和拼图的left属性值,得到滑块需要滑动的距离。代码如下:
distance=float(qk _ left[0])-float(2)#使用float()函数将所有数据转换为浮点数(即带小数点的数字)
计算结果如下:
计算滑动距离后,用第2.3节说明的方法模拟滑动。代码如下:
action=web driver . actionchchains(browser)#启动操作链
Action.click _ and _ hold(滑块)。perform () #按住滑块。
行动。move _ by _ offset (distance,0) #移动滑块,其中distance是之前计算的要滑动的距离,第二个参数0是Y轴方向要移动的距离。因为不需要在Y轴方向移动,所以设置为0。
Action.release()。执行()#释放滑块
完整的代码如下:
#完整的代码如下
导入时间
从selenium导入web驱动程序
# 1.访问网址
浏览器=webdriver。铬合金()
URL=r ' d:\ works \ python _ crawl 1 \ 《Python爬虫(进阶与进通)》代码摘要\2。验证码防爬\4。'滑动拼图验证码\基础滑动拼图验证码\index.html '
Browser.get(url) #用模拟浏览器打开网页
# 2.定位滑块并模拟单击以显示间隙。
slider=browser . find _ element _ by _ XPath('/*[@ id=' slide BTN ']')#定位滑块
Slider.click() #模拟单击滑块以
' div class='slide-box-shadow '。*?左:(。*?)px' #写正则表达式
Qk _ left=re.findall (p _ qk,data,re.s) #提取gap的左属性值。
打印(qk_left)
# 4.计算滑块需要滑动的距离
distance=float(qk _ left[0])-float(2)#使用float()函数将所有数据转换为浮点数(即带小数点的数字)
打印(距离)
# 5.开始滑动
action=web driver . actionchchains(browser)#启动操作链
Action.click _ and _ hold(滑块)。perform () #按住滑块。
Action.move _ by _ offset (distance,0) #移动滑块,其中260是之前计算的要滑动的距离。
Action.release()。执行()#释放滑块
补充知识点
如果不想滑动太快,可以将滑动距离分为3段,让滑块分3次滑动,每次滑动后等待一定时间。代码如下:
x1=距离/3
x2=x1
x3=距离- x1 - x2
action.move_by_offset(x1,0)
时间.睡眠(1)
action.move_by_offset(x2,0)
时间.睡眠(1)
action.move_by_offset(x3,0)
时间.睡眠(1)
action.release()。执行()
高级版滑动拼图验证码
初级版本的滑动拼图验证码在网页的源代码中写入了拼图的位置和缝隙,我们可以直接根据左边的属性值计算出滑动的距离,从而通过验证。而高级版的滑动拼图验证码将缺口集成到背景图片中,我们在网页源代码中找不到拼图和缺口的位置,这就给这个验证码的模拟验证增加了不少难度。人类通过对比没有缝隙的图像和有缝隙的图像来计算滑块需要滑动的距离。在命令行窗口执行命令“pip install pillow”来安装PIL库。首先用硒库打开网页。代码如下:
从selenium导入web驱动程序
浏览器=webdriver。铬合金()
URL=r ' d:\ works \ python _ crawl 1 \ 《Python爬虫(进阶与进通)》代码摘要\2。验证码防爬\4。'滑动拼图验证码\高级滑动拼图验证码\index.html '
Browser.get(url) #用模拟浏览器打开网页
通过XPath表达式定位验证码原图,截图保存。代码如下:
browser . find _ element _ by _ XPath('/*[@ id=' jigsaw canvas ']')。截图(' origin.png') #截图无间隙图片
捕获的无缺口图像如下图所示:
然后模拟点击滑块,会出现一个缺口。再次截图保存。代码如下:
slider=browser . find _ element _ by _ XPath('/*[@ id=' jigsaw circle ']')#定位滑块
Slider.click() #模拟单击滑块以使图像出现凹口。
browser . find _ element _ by _ XPath('/*[@ id=' jigsaw canvas ']')。截图(' after.png') #截取一张有缺口的图片
截取的缺口图像如下图所示:
大家可以看到,有缺口的形象和有缺口的形象有知识差距的区别,其他地方完全一样。通过比较两幅图像的像素,找出不同的像素,就可以知道差距的位置。PIL图书馆提供的ImageChops模块可以比较两幅图像的异同,并给出差距的位置。通过下面的代码从PIL库中导入所需的模块:
从PIL进口图片,图片印章
打开要与图像模块中的Open()函数进行比较的两个截图。代码如下:
image_a=Image.open('origin.png ')。转换(“RGB”)
image_b=Image.open('after.png ')。转换(“RGB”)
然后用ImageChops模块中的difference()函数比较两张截图的像素,得到差异的坐标值(注意这个验证码的缺口位置每次都是变化的,所以每次得到的坐标值都不一样)。代码如下:
x=image chops . difference(image _ a,image_b)。getbbox()
打印(x)
(261, 21, 313, 72)
getbbox()函数以元组的形式返回间隙的一组坐标值。
Distance=x[0] #第一个元素是从间隙的左边缘到图像左边缘的距离。
距离
然后使用开发者的工具检查白色圆角矩形的left属性值,即圆角矩形的左边界到图像左边界的距离,如下图所示:
减去前面得到的两个距离,就是滑块需要移动的距离。让我们移动滑块。代码如下:
action=web driver . actionchchains(browser)#启动操作链
Action.click _ and _ hold(滑块)。perform () #按住滑块。
Action.move _ by _
完整的代码如下:
从selenium导入web驱动程序
导入时间
从PIL进口图片,图片印章
# 1.访问网址
浏览器=webdriver。铬合金()
URL=r ' d:\ works \ python _ crawl 1 \ 《Python爬虫(进阶与进通)》代码摘要\2。验证码防爬\4。'滑动拼图验证码\高级滑动拼图验证码\index.html '
Browser.get(url) #用模拟浏览器打开网页
时间.睡眠(2)
# 2.获得没有间隙的图像
browser . find _ element _ by _ XPath('/*[@ id=' jigsaw canvas ']')。截图(' origin.png') #截图无间隙图片
# 3.得到一个缺口图像
slider=browser . find _ element _ by _ XPath('/*[@ id=' jigsaw circle ']')#定位滑块
Slider.click() #模拟单击滑块以使图像出现凹口。
browser . find _ element _ by _ XPath('/*[@ id=' jigsaw canvas ']')。截图(' after.png') #截取一张有缺口的图片
# 4.比较两个图像,得到你需要移动的距离。
image_a=Image.open('origin.png ')。转换(“RGB”)
image_b=Image.open('after.png ')。转换(“RGB”)
x=image chops . difference(image _ a,image_b)。getbbox()
打印(x)
Distance=x[0] #第一个元素是从间隙的左边缘到图像左边缘的距离。
距离
# 5.开始滑动
action=web driver . actionchchains(browser)#启动操作链
Action.click _ and _ hold(滑块)。perform () #按住滑块。
action . Move _ by _ offset(distance-10,0) #移动滑块,其中260是之前计算的要滑动的距离。
Action.release()。执行()#释放滑块
运行结果如下,可以看出验证已经成功通过。
本文关于Python对滑块拼图验证码的详细讲解到此为止。关于Python滑块拼图验证码的更多信息,请搜索我们之前的文章或者继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。