本文涉及:
滑块轨迹方法,参数可调
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import base64
import numpy as np
import cv2
import random
先上一部分基础的代码
class Run():
def __init__(self):
# 账号和密码区块
self.driver = webdriver.Chrome()
self.driver.get("https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F%3Fcu%3Dtrue%26utm_source%3Dbaidu-pinzhuan%26utm_medium%3Dcpc%26utm_campaign%3Dt_288551095_baidupinzhuan%26utm_term%3D0f3d30c8dba7459bb52f2eb5eba8ac7d_0_3ec3a567d542446dbcd153c13476aa06")
self.driver.implicitly_wait(5)
self.driver.find_element(By.CSS_SELECTOR, "div.login-tab.login-tab-r").click()
self.driver.find_element(By.CSS_SELECTOR,"#loginname").send_keys("账号")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR,"#nloginpwd").send_keys("密码")
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#loginsubmit").click()
time.sleep(1)
定位图片,通过opencv来对比两张图片找出缺口的位置
我们获取到的图片和网页上显示的验证码图片不是一样的大小
差值需要注意
处理图片的方法是固定的,直接引用就行
block:
img
图片数据是base64编码的,图片数据是在“base64,”之后
处理代码如下:
def slider(self):
"""
验证码登陆
:return:
"""
# 滑块的图片位置
block = self.driver.find_element(
By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[2]/img').get_attribute("src")
# 整张验证码的位置
img = self.driver.find_element(
By.XPATH,
'//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[1]/img').get_attribute('src')
block_ele = self.driver.find_element(By.XPATH, '//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[2]/div[3]')
def img_test(self,x,y):
"""
缺口坐标处理区块
:param x:
:param y:
:return:
"""
x = base64.b64decode(x.split(",")[-1])
img_array = np.frombuffer(x, np.uint8)
img = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)
y = base64.b64decode(y.split(",")[-1])
y = np.frombuffer(y, np.uint8)
template = cv2.imdecode(y, cv2.COLOR_RGB2BGR)
res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
value = cv2.minMaxLoc(res)[2][0]
# 获取的图片和显示的验证码图片大小有差
distance = value * 278 / 360
return distance
轨迹模拟是通过 s = vt * 1/2 * a *t ** 2 和 v = v0 + a * t
这个物理都学过的
以下轨迹失效后,可通过修改 t 和 a 的值,来实现新轨迹的生成,
通过机器学习的轨迹反爬,使得轨迹每隔一段时间便会失效
def offer(self,offset):
"""
处理滑块轨迹
:param offset:
:return:
"""
v, current = 0, 0
mid = offset * 3 / 5
tracks = []
t = 0.6
while current < offset:
if current < round(mid):
a = 2
else:
a = -3
s = v * t + 0.5 * a * (t ** 2)
current += s
v = v + a * t
tracks.append(round(s))
return tracks
源码:
CSDN-/京东selenium登陆.py at d36c6fd8f73d7787955f35e1abfc4c3a7512aa4a · thinkloading/CSDN- · GitHub