> 文档中心 > 京东轨迹反爬

京东轨迹反爬

京东轨迹反爬

 

本文涉及:

滑块轨迹方法,参数可调

from selenium.webdriver.common.action_chains import ActionChainsfrom selenium import webdriverfrom selenium.webdriver.common.by import Byimport timeimport base64import numpy as npimport cv2import 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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuA5LmI77yM5L2g6K-05ZWl4oqZz4niipk=,size_10,color_FFFFFF,t_70,g_se,x_16

 图片数据是base64编码的,图片数据是在“base64,”之后

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuA5LmI77yM5L2g6K-05ZWl4oqZz4niipk=,size_15,color_FFFFFF,t_70,g_se,x_16

 处理代码如下:

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

      

                  ​​​​​​​                        京东轨迹反爬

 京东轨迹反爬