:param driver: webdriver
:return: 返回验证码背景图片Image对象
“”"
webdriver.ActionChains(driver).move_to_element(slider).perform()
time.sleep(0.2)
img = driver.find_element_by_xpath(‘//*[@id=“captcha”]/div/div[1]/div[2]/div[1]/a[2]’)
if ‘show’ in img.get_attribute(‘class’):
res = img.screenshot_as_png
return Image.open(BytesIO(res))
else:
raise ValueError(‘获取验证码背景图片失败’)
有缺口图片:
def get_cut_image(driver):
“”"
点击滑动按钮获取有缺口图片
:param driver: webdriver
:return: 返回验证码有缺口图片的Image对象
“”"
slider = driver.find_element_by_xpath(‘//[@id=“captcha”]/div/div[3]/div[2]‘)
webdriver.ActionChains(driver).click_and_hold(slider).perform()
time.sleep(0.1)
img = driver.find_element_by_xpath(’//[@id=“captcha”]/div/div[1]/div[2]/div[1]/a[1]’)
res = img.screenshot_as_png
cut_img = Image.open(BytesIO(res))
return Image.open(BytesIO(res))
计算移动距离
找出缺口位置,计算移动距离。算法有很多,大家可以自由发挥。这里我们讲一种最简单的方法。我们要算出的距离是滑块要滑动的距离。
通过比较没有缺口的图片,和这张有缺口的图片,找出滑块的位置和缺口的位置即可。
经过观察,发现滑块出现的位置固定在x轴的0-100像素范围内,所以循环比较两张图片的x轴0-100像素范围内的每一行像素点,直到找到第一行出现两个图片像素点颜色完全不同的点,即找到了滑块的最左边最上的第一个像素点。
但是在实际操作中发现,虽然肉眼看起来两张图片公共部分一模一样,但是程序处理后的像素的具体rgb值也是不相同的,所以需要设置一个阈值来判断,具体需要进行测试。
按照相同的思路,比较两张图片x轴100-end像素的部分,找到缺口的最左最上那个点。
用找到的缺口像素点的x坐标减去找到的滑块的点的x坐标得到近似移动距离。这种算法,经过测试准确率还不错,大家如果在实际工作过程中发现有问题,需要根据具体情况去设计不同算法。
代码如下:
def get_distance(full_image, cut_image):
full_pixies = full_image.load()
cut_pixies = cut_image.load()
w, h = full_image.size
full_image.save(‘full.png’)
cut_image.save(‘cut.png’)
先找最左边不同的点
left = []
for j in range(h):
for i in range(100):
if abs(full_pixies[i, j][0] - cut_pixies[i, j][0]) + abs(full_pixies[i, j][1] - cut_pixies[i, j][1]) + abs(
full_pixies[i, j][2] - cut_pixies[i, j][2]) > 150:
left.append((i, j))
if left:
break
再找最右边不同的点
right = []
for j in range(h):
for i in range(100, w):
if abs(fu
版权归原作者 2401_84264583 所有, 如有侵权,请联系我们删除。