【 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)
Python全栈(后端、数据分析、脚本、爬虫、EXE客户端) / 前端(WEB,移动,H5) / Linux / SpringBoot / 机器学习