爬虫的一大难点就是破解验证码。验证码大致上分为文字识别、滑动、文字点击、图像识别等,本文讲的是其中的滑动验证码。滑动验证码,需要我们将滑块移至图片缺口位置。实际上我们可以通过对比完整图片和缺口图片各个像素点的RGB值,得出缺口位置左上角的坐标,然后构造轨迹算法使用selenium模拟移动滑块即可。
滑动验证码破解大致流程为:
1 - 获取缺口图片与原图片
2 - 图像对比,得出缺口左上角坐标
3 - 构造轨迹算法
4 - 使用selenium模拟移动滑块
本篇主要针对图像对比进行探讨。
使用工具:python,selenium,chromedriver,chrom浏览器
操作步骤讲解环节
下面就是喜闻乐见的操作步骤讲解环节了(´◔౪◔)
代码部分:
from PIL import Image
class get_Image_gap():
def get_gap(self, image1, image2):
self.Image1 = image1
self.Image2 = image2
# 从图片横坐标60开始取值,前面为滑块
self.Left = 60
# 用于记录缺口左上角的坐标
gap_x = 0
gap_y = 0
# 这里image1与image2图像的size应该是相同的
# 图像由一个个像素点构成,Image1.size[0]表示横坐标,Image1.size[1]表示纵坐标
for i in range(self.Left, self.Image1.size[0]):
for j in range(self.Image1.size[1]):
if not self.is_pixel_equal(i, j):
gap_x = i
gap_y = j
return gap_x, gap_y
return gap_x, gap_y
def is_pixel_equal(self, x, y):
# 取两个图片的像素点,返回该点的RGB值,如:(211, 181, 133, 255)
pixel1 = self.Image1.load()[x, y]
pixel2 = self.Image2.load()[x, y]
# 设置误差区间为60,该值需要自己设置
threshold = 60
# abs(x)返回绝对值
# 分别比较该点的RGB三值,若其中某个值的误差大于设定的threshold,则返回False,得出该点坐标
if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(pixel1[2] - pixel2[2]) < threshold:
return True
else:
return False
if __name__ == '__main__':
image1 = Image.open('./img/captcha1.png')
image2 = Image.open('./img/captcha2.png')
get_image_gap = get_Image_gap()
(gap_x, gap_y) = get_image_gap.get_gap(image1, image2)
print('缺口左上角坐标为:', '({}, {})'.format(gap_x, gap_y))
要点总结:
1 - 导入python的图像库Image,并使用该库打开两张图片(缺口图片与原图片)
2 - 从图片横坐标的60开始取值,因为缺口图片左端存在滑块
3 - 设置一个阈值,当两张图片相同坐标的像素点的RGB值超出阈值,则认为该点为缺口的左上角,并返回该点坐标
那么本次的分享就到这里了,喜欢的话麻烦点赞关注一下;不喜欢的话可以去看下小编的其他文章,肯定有喜欢的;都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧
有疑问的小伙伴也可以在评论区留言哦,我会第一时间解答的。
你点了吗◔ ‸◔?
网友评论