selenium模拟破解京东滑块验证码
原理:利用selenium模拟登陆京东,在账号密码多次输入错
误的情况下,网站会跳出滑块验证码,设计好代码自动下载验
证码原图,通过cv2识别计算出滑动距离。
话不多说,源码如下:
import timeimport requestsfrom selenium.webdriver import ActionChainsfrom mon.by import Byfrom selenium import webdriverfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECimport cv2import os,base64from urllib import request#账号密码随便输,多试几次会跳出验证码id_v='2725656674' #京东账号password_v='13049267664'#京东密码driver=webdriver.Chrome()wait=WebDriverWait(driver,3)driver.get('/')#加速度'''def get_tracks(x):v=0t=0.3tracks=[]current=0mid=x*4/5while current<x:if current<mid:a=2else:a=-3v0=vs=v0*t+0.5*a*(t**2)current+=stracks.append(round(s))v=v0+a*treturn tracks'''#界面点击账号登录enter=driver.find_element_by_xpath('//*[@id="ttbar-login"]/a[1]').click()#//*[@id="msShortcutLogin"]/span#点击账号登录login=driver.find_element_by_xpath('//*[@id="content"]/div[2]/div[1]/div/div[3]/a').click()#获取用户名和密码id=driver.find_element_by_xpath('//*[@id="loginname"]')id.send_keys(id_v)password=driver.find_element_by_xpath('//*[@id="nloginpwd"]')password.send_keys(password_v)#获取登录按钮btn=driver.find_element_by_xpath('//*[@id="loginsubmit"]').click()y=0while True:#验证码原图jd_bj=driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[1]/img')#滑块图jd_hk=driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[2]/img')#滑块ele_hk=driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[2]/div[3]')#提取src属性jd_img=jd_bj.get_attribute('src')hk_img=jd_hk.get_attribute('src')#print(jd_img)#print(hk_img)request.urlretrieve(jd_img, "jd_bj_img.png")request.urlretrieve(hk_img, "hk_bj_img.png")def juli():bj_rgb = cv2.imread('jd_bj_img.png')bj_gray = cv2.cvtColor(bj_rgb, cv2.COLOR_BGR2GRAY)hk_rgb = cv2.imread('hk_bj_img.png')res = cv2.matchTemplate(bj_rgb, hk_rgb, cv2.TM_CCOEFF_NORMED)lo = cv2.minMaxLoc(res)# print(lo[2][0])return lo[2][0] #识别返回滑动距离print("下载成功!")x = juli()# 278:网页原图像素# 360:下载后尺寸x = int(x * 278 / 360)#滑动滑块#seleniu滑动action=ActionChains(driver)#按住滑块元素action.click_and_hold(ele_hk).perform()#滑动距离#tracks=get_tracks(x)#for track in tracks:action.move_by_offset(x,0).perform()time.sleep(10)# 松开滑块action.release(ele_hk).perform()time.sleep(2)y=y+xif y==x:breakelse:y=0try:driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[1]/div[2]').click()time.sleep(1)except Exception as e:break
为了测试,花了几天的时间,奈何技术有限,虽然滑块能成功对上缺口,但就是登陆不了。
京东的反爬技术,估计能识别自动登录,但通过这次实践,对爬虫技术也有了一个更深度的了解。
不管什么网站,破解原理一样。像qq空间,豆瓣这种滑动距离不变,而且没有严格的反爬,就容易的多。