具体详情见代码,研究网站,随便输入手机号点击获取验证码
在自己写代码前参考了一批博客,是把所有验证码图片截取所有验证码图片保存在本地,再对比,感觉方法不行,所以自己写了个破解方法,通过js修改css直接抓取完整图片,因为上一篇写了B站,这里就不一一分析了,直接上代码:
破解成功界面
完整代码:
# - * -编码:utf - 8 - * “‘ 研究网站:https://account.ch.com/NonRegistrations-Regist 滑块验证码也分两种: 1 .直接给缺口图片,先滑动到缺口找到完整验证码图片,对比有缺口的验证码图片,然后计算缺口坐标,再利用硒移动按钮到指定位置 2 .直接给原图,缺口需要点击出现,直接保存原图,然后对比 “‘ 从硒进口webdriver 从selenium.webdriver.support。等进口WebDriverWait 从selenium.webdriver。支持导入expected_conditions EC 从selenium.webdriver.common.by进口 从硒。webdriver进口ActionChains lxml。html进口etree 从公益诉讼导入图像 从进口睡眠时间 进口稀土,请求 urllib。要求进口urlretrieve 从bs4进口BeautifulSoup 类SliderVerificationCode(对象): def __init__(自我):#初始化一些信息 自我。左=60 #定义一个左边的起点缺口一般离图片左侧有一定的距离有一个滑块 自我。url=' https://account.ch.com/NonRegistrations-Regist ' 自我。chromedriverPath=" C: \程序文件(x86) \谷歌Chrome \程序\ \ chromedriver.exe” 自我。司机=webdriver.Chrome (executable_path=self.chromedriverPath) 自我。等待=WebDriverWait(自我。司机,20)#设置等待时间20秒 自我。电话=" 18516544488 " def input_name_password(自我):#输入手机号 self.driver.get (self.url) self.driver.maximize_window () 自我。inputphone=self.wait.until (EC.presence_of_element_located ((。名字,phoneNumberInput))) self.inputphone.send_keys (self.phone) def click_login_button(自我):#点击登录按钮,出现验证码图片 login_button=self.wait.until (EC.element_to_be_clickable ((。ID, getDynamicPwd))) login_button.click () 睡眠(1) def get_geetest_image(自我):#获取验证码图片 #打印(self.driver.page_source) gapimg=self.wait.until (EC.presence_of_element_located ((。CLASS_NAME, geetest_canvas_bg))) 睡眠(2) gapimg.screenshot (r/captcha1.png。) #通过js代码修改标签样式显示图片2 js=' var=document.getElementsByClassName变化(“geetest_canvas_fullbg”);改变[0]。风格="显示:块;“ self.driver.execute_script (js) 睡眠(2) fullimg=self.wait.until ( EC.presence_of_element_located ((。CLASS_NAME, geetest_canvas_fullbg))) fullimg.screenshot (r/captcha2.png。) def is_similar(自我,image1 image2, x, y): “判断两张图片各个位置的像素是否相同 # image1:带缺口的图片 :param image2:不带缺口的图片 :param x:位置x y: param y:位置 返回:(x, y)位置的像素是否相同 “‘ #获取两张图片指定位置的像素点 pixel1=image1.load () (x, y) pixel2=image2.load () (x, y) #设置一个阈值允许有误差 阈值=60 #彩色图每个位置的像素点有三个通道 如果abs (pixel1 [0] - pixel2 [0]) & lt;阈值和abs (pixel1 [1]——pixel2 [1]) & lt;阈值和abs ( pixel1 [2]——pixel2 [2]) & lt;阈值: 还真 其他: 返回假 def get_diff_location(自我):#获取缺口图起点 captcha1=Image.open (“captcha1.png”) captcha2=Image.open (“captcha2.png”) x的范围(自我。离开,captcha1.size[0]): #从左到右x方向 y的范围(captcha1.size[1]): #从上到下y方向 如果没有自我。is_similar (captcha1 captcha2, x, y): 返回x #找到缺口的左侧边界在x方向上的位置 def get_move_track(自我、gap): 跟踪=[]#移动轨迹 当前=0 #当前位移 #减速阈值 中期=差距* 4/5 #前4/5段加速后1/5段减速 t=0.2 #计算间隔 v=0 #初速度 虽然目前& lt;差距: 如果当前& lt;中期:=3 #加速度为+ 3 其他:=3 #加速度为3 v0=v #初速度半 v=v0 + t * #当前速度 移动=v0 * t + 1/2 * * t * #移动距离 当前+=#当移动前位移 track.append(圆(移动))#加入轨迹 返回跟踪 def move_slider(自我、跟踪): 滑块=self.wait.until (EC.presence_of_element_located ((。CSS_SELECTOR, .geetest_slider_button))) ActionChains (self.driver) .click_and_hold(滑块).perform () x在跟踪:#只有水平方向有运动按轨迹移动 ActionChains (self.driver)。move_by_offset (xoffset=x, yoffset=0) .perform () 睡眠(1) .perform ActionChains (self.driver) .release()() #松开鼠标 def主要(自我): self.input_name_password () self.click_login_button () self.get_geetest_image () 差距=self.get_diff_location() #缺口左起点位置 差距=差距- 6 #减去滑块左侧距离图片左侧在x方向上的距离即为滑块实际要移动的距离 跟踪=self.get_move_track (gap) 打印(“移动轨迹”,跟踪) self.move_slider(跟踪) if __name__==癬_main__”: springAutumn=SliderVerificationCode () springAutumn.main ()硒+铬滑动验证码破解二(某某网站)