selenium模拟破解京东滑块验证码
原理:利用selenium模拟登陆京东,在账号密码多次输入错
误的情况下,网站会跳出滑块验证码,设计好代码自动下载验
证码原图,通过cv2识别计算出滑动距离。
话不多说,源码如下:
import time
import requests
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import cv2
import os,base64
from urllib import request
id_v='2725656674'
password_v='13049267664'
driver=webdriver.Chrome()
wait=WebDriverWait(driver,3)
driver.get('https://www.jd.com/')
'''
def get_tracks(x):
v=0
t=0.3
tracks=[]
current=0
mid=x*4/5
while current<x:
if current<mid:
a=2
else:
a=-3
v0=v
s=v0*t+0.5*a*(t**2)
current+=s
tracks.append(round(s))
v=v0+a*t
return tracks
'''
enter=driver.find_element_by_xpath('//*[@id="ttbar-login"]/a[1]').click()
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=0
while 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]')
jd_img=jd_bj.get_attribute('src')
hk_img=jd_hk.get_attribute('src')
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)
return lo[2][0]
print("下载成功!")
x = juli()
x = int(x * 278 / 360)
action=ActionChains(driver)
action.click_and_hold(ele_hk).perform()
action.move_by_offset(x,0).perform()
time.sleep(10)
action.release(ele_hk).perform()
time.sleep(2)
y=y+x
if y==x:
break
else:
y=0
try:
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空间,豆瓣这种滑动距离不变,而且没有严格的反爬,就容易的多。
|