原理:利用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
#界面点击账号登录
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=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]')
#提取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+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空间,豆瓣这种滑动距离不变,而且没有严格的反爬,就容易的多。