VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • 爬虫(十二):图形验证码的识别、滑动验证码的识(3)

self.driver.find_element_by_class_name("btn-login")
  • login_btn.click()
  • sleep(3)
  • 第一步的工作就完成了。

    1.3.5 识别缺口

    接下来识别缺口的位置,首先获取前后两张比对图片,二者不一致的地方即为缺口。看到网上那些案例,接收到乱序的两张图片,然后用代码拼接起来,麻烦的要死,而且我试了几个,绝大部分是不能运行的,就一个能截图出来的,截出来的图如下:

     

     

     

     

    我只想登录一下,还要我干这么多事,我哭了。

    所以我就换了种方法,这个版本的极验验证码应该都可以这样做,代码如下:

    
    	
    1. def get_geetest_image(self): # 获取验证码图片
    2. gapimg = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_bg')))
    3. sleep(2)
    4. gapimg.screenshot(r'./captcha1.png')
    5. # 通过js代码修改标签样式 显示图片2
    6. js = 'var change = document.getElementsByClassName("geetest_canvas_fullbg");change[0].style = "display:block;"'
    7. self.driver.execute_script(js)
    8. sleep(2)
    9. fullimg = self.wait.until(
    10. EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_slice')))
    11. fullimg.screenshot(r'./captcha2.png')
    12.  
    13. def is_similar(self, image1, image2, x, y):
    14. '''判断两张图片 各个位置的像素是否相同
    15. #image1:带缺口的图片
    16. :param image2: 不带缺口的图片
    17. :param x: 位置x
    18. :param y: 位置y
    19. :return: (x,y)位置的像素是否相同
    20. '''
    21. # 获取两张图片指定位置的像素点
    22. pixel1 = image1.load()[x, y]
    23. pixel2 = image2.load()[x, y]
    24. # 设置一个阈值 允许有误差
    25. threshold = 60
    26. # 彩色图 每个位置的像素点有三个通道
    27. if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
    28.     pixel1[2] - pixel2[2]) < threshold:
    29.     return True
    30. else:
    31.     return False

    截取到的图如下:

     

    比乱序乱序的图舒服多了,而且代码量也少。 

    1.3.6 模拟拖动滑块

    模拟拖动过程不复杂 ,但其中的坑比较多。现在我们只需要调用拖功的相关函数将滑块拖动到对应位置。如果是匀速拖动,极验必然会识别出它是程序的操作,因为人无法做到完全匀速拖动。极验验证码利用机器学习模型,筛选此类数据为机器操作,验证码识别失败。

    我们尝试分段模拟将拖动过程划分几段,前段滑块做匀加速运动,后段滑块做匀减速运动, 利用物理学的加速度公式即可完成验证。

    滑块滑动的加速度用a来表示,当前速度用表示,初速度用v0表示 ,位移用x表示 ,所需时间用t表示,它们满足如下关系:

    x = v0 * t +0.5 * a * t * t

    v = v0 + a * t

    利用这两个公式可以构造轨迹移动算法,计算出先加速后减速的运动轨迹,代码实现如下:

    
    	
    1. def get_diff_location(self): # 获取缺口图起点
    2. captcha1 = Image.open('captcha1.png')
    3. captcha2 = Image.open('captcha2.png')
    4. for x in range(self.left, captcha1.size[0]): # 从左到右 x方向
    5. for y in range(captcha1.size[1]): # 从上到下 y方向
    6. if not self.is_similar(captcha1, captcha2, x, y):
    7. return x # 找到缺口的左侧边界 在x方向上的位置
    8.  
    9. def get_move_track(self, gap):
    10. track = [] # 移动轨迹
    11. current = 0 # 当前位移
    12. # 减速阈值
    13. mid = gap * 4 / 5 # 前4/5段加速 后1/5段减速
    14. t = 0.2 # 计算间隔
    15. v = 0 # 初速度
    16. while current < gap:
    17. if current < mid:
    18. a = 5 # 加速度为+5
    19. else:
    20. a = -5 # 加速度为-5
    21. v0 = v # 初速度v0
    22. v = v0 + a * t # 当前速度
    23. move = v0 * t + 1 / 2 * a * t * t # 移动距离
    24. current += move # 当前位移
    25. track.append(round(move)) # 加入轨迹
    26. return track
    27.  
    28. def move_slider(self, track):
    29. slider = self.wait.
    
    相关教程