【 Python爬虫】京东滑块登录

import random
import time
import cv2
from selenium import webdriver
import requests
import base64
import io
from PIL import Image
from selenium.webdriver import ActionChains


# 获取实际滑块缺口位置
def get_distance(bg, tp):
    '''
    bg: 背景图片
    tp: 缺口图片
    out:输出图片
    '''
    # 读取背景图片和缺口图片
    bg_img = cv2.imread(bg)  # 背景图片
    tp_img = cv2.imread(tp)  # 缺口图片
    # 缺口匹配
    res = cv2.matchTemplate(bg_img, tp_img, cv2.TM_CCOEFF_NORMED)
    value = cv2.minMaxLoc(res)[2][0]
    distance = value * 278 / 360
    return int(distance)



# 生成一个列表,和为19
def generate_list():
    while True:
        lst = random.sample(range(1, 20), random.randint(2, 4))
        if sum(lst) == 19:
            return lst


# 登录
def jd_login(drive_path,username,password):
    """
        :param drive_path:  驱动位置
        :param username:    账号
        :param password:    密码
    :return:
    """
    login_url = "https://passport.jd.com/new/login.aspx"
    while True:
        driver = webdriver.Firefox(executable_path=drive_path)
        driver.set_window_size(1400,800)
        driver.get(login_url)
        driver.find_element_by_id("loginname").send_keys(username)
        driver.find_element_by_id("nloginpwd").send_keys(password)
        time.sleep(1)
        driver.find_element_by_id("loginsubmit").click()
        time.sleep(1)
        # 背景图片
        element = driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[1]/img')
        base64_string = str(element.get_attribute("src")).split("base64,")[1]
        image_data = base64.b64decode(base64_string)
        image = Image.open(io.BytesIO(image_data))
        image.save("./bg.png")
        # 滑块图片
        element = driver.find_element_by_xpath('//*[@id="JDJRV-wrap-loginsubmit"]/div/div/div/div[1]/div[2]/div[2]/img')
        base64_string = str(element.get_attribute("src")).split("base64,")[1]
        image_data = base64.b64decode(base64_string)
        image = Image.open(io.BytesIO(image_data))
        image.save("./tp.png")

        # 计算滑块的距离
        distance = int(get_distance('bg.png','tp.png'))
        slider = driver.find_element_by_class_name('JDJRV-smallimg')
        ActionChains(driver).click_and_hold(slider).perform()  # 按住滑块
        ActionChains(driver).move_by_offset(distance + random.randint(22,23), 0).perform()   # 移动缺口过后
        time.sleep(random.uniform(0.5,0.8))    # 停留时间
        for x in generate_list():
            ActionChains(driver).move_by_offset( - x, 0).perform() # 逆向移动
            time.sleep(random.uniform(0.1, 0.3))
        ActionChains(driver).release().perform()   # 释放
        time.sleep(2)
        # 检测是否成功
        window_handles = driver.window_handles
        driver.switch_to.window(window_handles[0])
        current_url = driver.current_url
        if login_url != current_url:
            print("登录成功")
            return driver
        else:
            print("登录失败")
            driver.quit()
            time.sleep(2)



if __name__ == '__main__':
    driver = jd_login("./geckodriver","u_username","u_password")
    driver.get(url="https://item.jd.com/10074533820048.html")
    time.sleep(1)
    price = driver.find_element_by_xpath('/html/body/div[6]/div/div[2]/div[4]/div/div[1]/div[2]/span[1]/span[2]').text
    print("价格",price)




posted @ 2023-10-25 08:48  PythonNew_Mr.Wang  Views(521)  Comments(0Edit  收藏  举报