京东轨迹反爬

123cd6bc16f143b4b6347ca68e59500e.png

 

本文涉及:

滑块轨迹方法,参数可调

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:

3e111338c59546679779fcba3491fcc2.png

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

      

                  ​​​​​​​                        2a57ade52f984e5eb8c0558f6759e371.png

 5186226415954459b94f678f7b2f629e.gif

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值