概述
首先声明不是远程,我是拿了这位大哥的代码(找不到了QAQ:找到补上)修改,然后遇到问题,给解决了
因为公司业务,需要使用python模拟人为操作自动登录京东,python首选selenium,先看这位前辈写的 ,可以直接破解原代码https://blog.csdn.net/wawawawawawaa/article/details/115261440?ops_request_misc=&request_id=&biz_id=102&utm_term=PYTHON%20%E4%BA%AC%E4%B8%9C%E6%8B%BC%E5%9B%BE&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-7-115261440.142^v14^pc_search_result_control_group,157^v14^control&spm=1018.2226.3001.4187
但是他不是用的 selenium,有喜欢的朋友可以研究一下,因为业务需求我有必须用selenium解决,所以只能另寻它法,然后遇到第一个问题 就是元素标签定位不到,试用了好多 ,ID,类名什么的
browser.find_element_by_class_name("login-tab.login-tab-r").click()
# 点击账号密码登录
browser.find_element_by_id("loginname").send_keys(username)
# u
browser.find_element_by_id("nloginpwd").send_keys(password)
# p
browser.find_element_by_id("loginsubmit").click()
# 点击登录
全部定位不到,后来我发现了 from ,我就想是不是因为表单的问题,需要解决先进入表单,是不是就能找到这些元素标签了,然后我找到这篇文章https://blog.csdn.net/weixin_42262081/article/details/107401600?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165578011416781432993790%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165578011416781432993790&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-107401600-null-null.142^v19^pc_rank_34,157^v15^new_3&utm_term=selenium%E8%BF%9B%E5%85%A5%E5%88%B0from&spm=1018.2226.3001.4187
这里面用的163做的,而我们是用京东,需要找到相同之处
我就发现了 都是iframe标签,F12检查显示,搜索,代码修改
browser.find_element(by=By.XPATH, value="//html/body/div/div/div/div[1]/div[2]").click()
# 点击账号密码登录
# 在from表单进不去,所以需要切换进去表单
#获取表单ifrom
id="loginFrame"
xpath=browser.find_element(by=By.XPATH, value='//*[@id="loginFrame"]')
# 进入表单
browser.switch_to.frame(xpath)
wait.until(EC.presence_of_element_located(('id', 'loginname'))).send_keys(username)
wait.until(EC.presence_of_element_located(('id', 'nloginpwd'))).send_keys(password)
wait.until(EC.presence_of_element_located(('id', 'paipaiLoginSubmit'))).click()
搞定OK.
接下来是完整代码,不过滑块问题依然没有解决,因为计算偏量的问题我还要修改,修改好了 我也会修改这篇文章
import cv2
import time,os,sys
import numpy as np
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains
#补判断模块(在大神基础上补充了下面模块)
from selenium.webdriver.support import expected_conditions as EC
#判断元
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
def loadpage(browser,username, password):
browser.get('https://passport.shop.jd.com/login/index.action')
# 打开京东网址
browser.find_element(by=By.XPATH, value="//html/body/div/div/div/div[1]/div[2]").click()
# 点击账号密码登录
# 在from表单进不去,所以需要切换进去表单
#获取表单ifrom
id="loginFrame"
xpath=browser.find_element(by=By.XPATH, value='//*[@id="loginFrame"]')
# 进入表单
browser.switch_to.frame(xpath)
wait.until(EC.presence_of_element_located(('id', 'loginname'))).send_keys(username)
wait.until(EC.presence_of_element_located(('id', 'nloginpwd'))).send_keys(password)
wait.until(EC.presence_of_element_located(('id', 'paipaiLoginSubmit'))).click()
time.sleep(2)
getPic(browser)
while True:
try:
failure = WebDriverWait(browser, 10, 2).until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'JDJRV-slide-center'), '向右滑动完成拼图'))
print('failure')
except:
print('验证成功')
return
None
if failure:
getPic(browser)
def getPic(browser):
# 用于找到登录图片的大图
s2 = r'//div/div[@class="JDJRV-bigimg"]/img'
# 用来找到登录图片的小滑块
s3 = r'//div/div[@class="JDJRV-smallimg"]/img'
bigimg = browser.find_element(by=By.XPATH, value=s2).get_attribute("src")
smallimg = browser.find_element(by=By.XPATH, value=s3).get_attribute("src")
# print(smallimg + 'n')
# print(bigimg)
# 背景大图命名
backimg = "backimg.png"
# 滑块命名
slideimg = "slideimg.png"
# 下载背景大图保存到本地
request.urlretrieve(bigimg, backimg)
# 下载滑块保存到本地
request.urlretrieve(smallimg, slideimg)
# 获取图片并灰度化
block = cv2.imread(slideimg, 0)
template = cv2.imread(backimg, 0)
# 二值化后的图片名称
#灰度化后的图片识别率高
blockName = "block.jpg"
templateName = "template.jpg"
# 将二值化后的图片进行保存
cv2.imwrite(blockName, block)
cv2.imwrite(templateName, template)
block = cv2.imread(blockName)
block = cv2.cvtColor(block, cv2.COLOR_RGB2GRAY)
block = abs(255 - block)
cv2.imwrite(blockName, block)
block = cv2.imread(blockName)
template = cv2.imread(templateName)
# 获取偏移量
result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED)
# 查找block在template中的位置,返回result是一个矩阵,是每个点的匹配结果
x, y = np.unravel_index(result.argmax(), result.shape)
print('此前代码可正常运行')
# 获取滑块
element = browser.find_element(by=By.XPATH, value=s3)
ActionChains(browser).click_and_hold(on_element=element).perform()
#time.sleep() #这行不能加time.sleep,因为在这停顿了,京东基本就认定你是机器人了
ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=y*4/5, yoffset=0).perform()
#本人在大神基础上将y改为了y*4/5
time.sleep(0.2)
#本人加的第一行
ActionChains(browser).move_to_element_with_offset(to_element=element, xoffset=y -y*7/10, yoffset=0).perform()
#本人加的第二行,为了模拟人的行为
ActionChains(browser).release(on_element=element).perform()
time.sleep(3)
#打开网页,输入账号密码
browser = webdriver.Chrome()
browser.maximize_window()
wait=WebDriverWait(browser, 10)
loadpage(browser, "123456", "123456") #第二个空输入京东账号,第三个空输入京东密码
最后
以上就是朴实蓝天为你收集整理的京东 京麦,京东商家后台自动登录,滑块验证selenium进入到from表单的全部内容,希望文章能够帮你解决京东 京麦,京东商家后台自动登录,滑块验证selenium进入到from表单所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复