当前位置:   article > 正文

【Python爬虫】 验证码图像识别 --- 第三弹 (极验验证码识别)_极验获取不带缺口图片

极验获取不带缺口图片


使用selenium模拟浏览器完成极验验证码的识别:
        
            首先使用PIL模块获取到验证码 有缺块 和 没缺块 的两张图片图片
然后对这两张图片进行比较获取到却块的偏移量,再根据偏移量,算出他的移动轨迹
最后 获取到滑块,模拟鼠标点击滑动完成拼图;
        注意 : 滑块滑动的时候要变速滑动,不然会被检测到不是人为拼图,就算拼完整了也算失败


代码如下 :

 

 

  1. '''
  2. 滑块验证码
  3. 哔哩哔哩 登录验证
  4. '''
  5. from selenium.webdriver.common.action_chains import *
  6. from selenium import webdriver
  7. import time
  8. import random
  9. from PIL import Image
  10. patn = 'chromedriver.exe'
  11. browser = webdriver.Chrome(patn)
  12. # 获取偏移量
  13. def get_distance(image1,image2):
  14. '''
  15. 拿到滑动验证码需要移动的距离
  16. :param image1:没有缺口的图片对象
  17. :param image2:带缺口的图片对象
  18. :return:需要移动的距离
  19. '''
  20. threshold=60
  21. left=57
  22. for i in range(left,image1.size[0]):
  23. for j in range(image1.size[1]):
  24. rgb1=image1.load()[i,j]
  25. rgb2=image2.load()[i,j]
  26. res1=abs(rgb1[0]-rgb2[0])
  27. res2=abs(rgb1[1]-rgb2[1])
  28. res3=abs(rgb1[2]-rgb2[2])
  29. if not (res1 < threshold and res2 < threshold and res3 < threshold):
  30. return i-7 #经过测试,误差为大概为7
  31. return i-7 #经过测试,误差为大概为7
  32. # 拿到移动轨迹
  33. def get_tracks(distance):
  34. '''
  35. 拿到移动轨迹,模仿人的滑动行为,先匀加速后匀减速
  36. 匀变速运动基本公式:
  37. ①v=v0+at
  38. ②s=v0t+½at²
  39. ③v²-v0²=2as
  40. :param distance: 需要移动的距离
  41. :return: 存放每0.3秒移动的距离
  42. '''
  43. # 初速度
  44. v = 0
  45. # 单位时间为0.2s来统计轨迹,轨迹即0.2内的位移
  46. t = 0.3
  47. # 位移/轨迹列表,列表内的一个元素代表0.2s的位移
  48. tracks = []
  49. # 当前的位移
  50. current = 0
  51. # 到达mid值开始减速
  52. mid = distance * 4 / 5
  53. while current < distance:
  54. if current < mid:
  55. # 加速度越小,单位时间的位移越小,模拟的轨迹就越多越详细
  56. a = 2
  57. else:
  58. a = -3
  59. # 初速度
  60. v0 = v
  61. # 0.2秒时间内的位移
  62. s = v0 * t + 0.5 * a * (t ** 2)
  63. # 当前的位置
  64. current += s
  65. # 添加到轨迹列表
  66. tracks.append(round(s))
  67. # 速度已经达到v,该速度作为下次的初速度
  68. v = v0 + a * t
  69. return tracks
  70. # 鼠标模拟滑动,按照轨迹拖动,完全验证
  71. def move_slider(tracks):
  72. ActionChains(browser).click_and_hold(slider).perform()
  73. for track in tracks:
  74. ActionChains(browser).move_by_offset(xoffset=track, yoffset=0).perform()
  75. else:
  76. ActionChains(browser).move_by_offset(xoffset=3, yoffset=0).perform() # 先移过一点
  77. ActionChains(browser).move_by_offset(xoffset=-3, yoffset=0).perform() # 再退回来,是不是更像人了
  78. time.sleep(0.5) # 0.5秒后释放鼠标
  79. ActionChains(browser).release().perform()
  80. if __name__ == '__main__':
  81. try:
  82. browser.get('https://passport.bilibili.com/login')
  83. browser.save_screenshot('lodin.png')
  84. username = browser.find_element_by_id('login-username')
  85. password = browser.find_element_by_id('login-passwd')
  86. # 获取滑块
  87. slider = browser.find_element_by_xpath('//div[@id="gc-box"]/div/div[3]/div[2]')
  88. print(slider)
  89. username.send_keys('账号')
  90. password.send_keys('密码')
  91. # 鼠标悬停事件(显示完整图片)
  92. ActionChains(browser).move_to_element(slider).perform()
  93. time.sleep(1)
  94. screenshot = browser.save_screenshot('tu1.png')
  95. print(type(screenshot))
  96. time.sleep(2)
  97. # 鼠标点击(显示残缺图片)
  98. slider.click()
  99. time.sleep(3)
  100. browser.save_screenshot('tu2.png')
  101. # 获取 图片的位置大小
  102. img1 = browser.find_element_by_xpath(xpath='//div[@class="gt_cut_fullbg gt_show"]')
  103. location = img1.location
  104. size = img1.size
  105. top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
  106. 'width']
  107. print('图片的宽:', img1.size['width'])
  108. print(top, bottom, left, right)
  109. # 保存 裁剪 图片
  110. img_1 = Image.open('tu1.png')
  111. img_2 = Image.open('tu2.png')
  112. capcha1 = img_1.crop((left, top, right, bottom))
  113. capcha2 = img_2.crop((left, top, right, bottom))
  114. capcha1.save('tu1-1.png')
  115. capcha2.save('tu2-2.png')
  116. # 获取验证码图片
  117. img_11 = Image.open('tu1-1.png')
  118. img_22 = Image.open('tu2-2.png')
  119. distance = get_distance(img_11, img_22)
  120. tracks = get_tracks(distance)
  121. print(tracks)
  122. print(distance, sum(tracks))
  123. move_slider(tracks)
  124. except:
  125. pass
  126. # time.sleep(10)
  127. # browser.close()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/287245
推荐阅读
相关标签
  

闽ICP备14008679号