爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动) 您所在的位置:网站首页 智能验证按钮 爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)

爬虫:通过滑动或者点触验证码的方法及实现(点触+滑动)

2024-06-30 13:48| 来源: 网络整理| 查看: 265

一、极验验证码(geetest)的三种验证模式

以极验官网登录(https://auth.geetest.com/login/)为例:

 

 在点击 “点击按钮进行验证”按钮后,会出现三种情况

1.点击直接通过

在一段时间的前几次登录时,点击按钮,会直接通过验证:

 

 

2.点击出现滑动验证码

登录几次后,再次登录时,就会出现滑动验证码:

 

 3.点击出现点触验证码:

登录过多时,就会出现点触验证码,这也是极验最难的一种验证码:

 

 

 二、分析

利用Python的selenium模块进行自动登录。

1.判断是否通过验证:

有一个类名为geetest_success_radar_tip的div标签,在加载后内容为空,验证成功后,内容变为“验证成功”,可以通过其内容来判断,是否验证成功。

下面是我截取的自己写的一段代码,主要是表达出含义,没有截取所有代码,理解就好: self.success = self.browser.find_element_by_css_selector('.geetest_success_radar_tip') # 获取显示结果的标签 def is_success(self): time.sleep(1) if self.success.text == "验证成功": return True else: return False

 

 

 2.点击直接通过

在点击“点击验证按钮”后,对是否验证成功进行一次判断,如果验证通过,则可以进行下一步动作。

3.滑动验证

滑动验证的标签是canvas,类名是geetest_canvas_slice,在点击“点击验证”后,如果是滑动验证,这个标签将会被加载,如果不是,则这个标签不会被加载。

所以可以通过查看是否存在这个标签,来判断验证是否是滑动验证:

def is_slide(self): time.sleep(1) try: slie_img = self.browser.find_element_by_css_selector('canvas.geetest_canvas_slice') if slie_img: return slie_img except NoSuchElementException: return False

 

如果是滑动验证,则可以通过比对有缺口图片和原图片,从而确定缺口的位置,然后模拟滑动滑块,从而达到验证的目的。具体操作,我在上一篇随笔中已经写过,请参考: https://www.cnblogs.com/ohahastudy/p/11493971.html 4.点触验证

和滑动验证类似,点触验证可以通过判断是否存在类名为geetest_item_img的img标签来判断该验证为点触验证。

 

 

 

def is_pick(self): try: pick_img = self.browser.find_element_by_css_selector('img.geetest_item_img') return pick_img except NoSuchElementException: return False

 

保存该图片后,我们可以发现,该图片实际上是由两部分组成:

 

 图片中验证码的识别,我是通过超级鹰这个平台来识别的。按照超级鹰的文档,将图片发过去,并指明类型,在几秒之后会返回一个结果,内容含有需要识别模块的坐标,而其顺序也是按照上图中白色部分指定的顺序,可以说是非常贴心了。

获取坐标后,将坐标提取出来,然后通过模拟点击即可。

三、具体实现: from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from PIL import Image from six import BytesIO import time from selenium.webdriver import ActionChains from selenium.common.exceptions import NoSuchElementException import requests import chaojiying #超级鹰提供的模块,需要去官网下载 class Verifycode(): def __init__(self): self.browser = webdriver.Chrome() def get_url(self, url, user, password): self.browser.get(url) self.browser.maximize_window() wait = WebDriverWait(self.browser, 10) wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_radar_btn'))) user_input, pwd_input, *_ = self.browser.find_elements_by_css_selector('input.ivu-input') print(user_input) btn = self.browser.find_element_by_css_selector('.geetest_radar_btn') user_input.send_keys(user) pwd_input.send_keys(password) btn.click() time.sleep(1) self.success = self.browser.find_element_by_css_selector('.geetest_success_radar_tip') # 获取显示结果的标签 def is_success(self): time.sleep(1) if self.success.text == "验证成功": return True else: return False def get_position(self, img_label): location = img_label.location size = img_label.size top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[ 'width'] return (left, top, right, bottom) def get_screenshot(self): screenshot = self.browser.get_screenshot_as_png() f = BytesIO() f.write(screenshot) return Image.open(f) def get_position_scale(self, screen_shot): height = self.browser.execute_script('return document.documentElement.clientHeight') width = self.browser.execute_script('return document.documentElement.clientWidth') x_scale = screen_shot.size[0] / (width + 10) y_scale = screen_shot.size[1] / (height) return (x_scale, y_scale) def get_slideimg_screenshot(self, screenshot, position, scale): x_scale, y_scale = scale position = [position[0] * x_scale, position[1] * y_scale, position[2] * x_scale, position[3] * y_scale] return screenshot.crop(position) def compare_pixel(self, img1, img2, x, y): pixel1 = img1.load()[x, y] pixel2 = img2.load()[x, y] threshold = 50 if abs(pixel1[0] - pixel2[0])


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有