爬虫的一大难点就是破解验证码。验证码大致上分为文字识别、滑动、文字点击、图像识别等,本文讲的是其中的 滑动验证码
。滑动验证码,需要我们将滑块移至图片缺口位置。实际上我们可以通过对比完整图片和缺口图片各个像素点的RGB值,得出缺口位置左上角的坐标,然后构造轨迹算法使用selenium模拟移动滑块即可。
滑动验证码破解大致流程为:
1 - 获取缺口图片与原图片
2 - 图像对比,得出缺口左上角坐标
3 - 构造轨迹算法
4 - 使用selenium模拟移动滑块
本篇主要针对模拟移动进行探讨。
使用工具:python,selenium,chromedriver,chrom浏览器
操作步骤讲解环节
下面就是喜闻乐见的操作步骤讲解环节了(´◔౪◔)
代码部分:
代码语言:txt复制from selenium import webdriver代码语言:txt复制from selenium.webdriver.common.action_chains import ActionChains代码语言:txt复制import time代码语言:txt复制from selenium.webdriver.common.by import By代码语言:txt复制from selenium.webdriver.support.ui import WebDriverWait代码语言:txt复制from selenium.webdriver.support import expected_conditions as EC代码语言:txt复制# 导本地包的模块代码语言:txt复制import os代码语言:txt复制import sys代码语言:txt复制path = os.path.dirname(os.path.dirname(__file__))代码语言:txt复制sys.path.append(path)代码语言:txt复制import test代码语言:txt复制# 108这个值就是前面图像对比后得出的缺口左上角的横坐标代码语言:txt复制# 这里导入横坐标,然后获取先匀加速后匀减速的轨迹列表代码语言:txt复制track = test.get_track(108)代码语言:txt复制print(track)代码语言:txt复制driver = webdriver.Chrome()代码语言:txt复制url = 'http://www.geetest.com/Register'代码语言:txt复制wait = WebDriverWait(driver, 10, 0.5)代码语言:txt复制driver.get(url)代码语言:txt复制# 获取到指定的元素代码语言:txt复制Phone_Number = driver.find_element_by_xpath('/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[1]/input')代码语言:txt复制Verification_Code = driver.find_element_by_xpath('/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[2]/input')代码语言:txt复制Code_Button = driver.find_element_by_xpath('/html/body/div[1]/div/div[8]/div/div[2]/div[1]/div[2]/div/div[2]/div[2]/div[1]/div')代码语言:txt复制Phone_Number.send_keys('12345678910')代码语言:txt复制Code_Button.click()代码语言:txt复制# 等待className为geetest_slider_button的元素在元素表中出现代码语言:txt复制slider = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_slider_button')))代码语言:txt复制# 点击和按住代码语言:txt复制ActionChains(driver).click_and_hold(slider).perform()代码语言:txt复制# 拖动代码语言:txt复制for x in track:代码语言:txt复制 ActionChains(driver).move_by_offset(xoffset=x, yoffset=0).perform()代码语言:txt复制time.sleep(2)代码语言:txt复制# 松开鼠标代码语言:txt复制ActionChains(driver).release().perform()代码语言:txt复制time.sleep(2)代码语言:txt复制driver.quit()**要点总结:
1 - 需要用到前面两篇文章的参数,图像对比得出缺口左上角的横坐标,然后使用轨迹移动算法,获取轨迹列表
2 - 使用selenium的鼠标操作方法完成滑块拖动**


