0
点赞
收藏
分享

微信扫一扫

京东selenium登陆

南陵王梁枫 2022-03-10 阅读 68

 

本文涉及:

滑块轨迹方法,参数可调

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

      

          ​​​​​​​        ​​​​​​​                        

 

 

 

举报

相关推荐

0 条评论