京东这一个网站呢,适合和豆瓣有点相似的,但是呢,豆瓣应该是最近改版了,看过以前的视频都知道,豆瓣和京东,里面的滑块图片和背景图片都能在我们的网页中的src中找到但是呢,豆瓣改成了下面的鬼样子。

那我们的京东是可以在网页中找到我们滑块图片和背景图的src属性。而豆瓣呢只能通过打码平台去实现滑动,你说巧不巧,我搞不明白。。这就很尴尬。。那么我们的京东登录,是可以定位到我们的大图和小图的,所以我们就可以不借用打码平台来实现,当然,想借用打码平台也可以,只要你会。是吧!。
那么我们就直接进入正文。。

1.导入我们所需要的模块

import cv2#处理图片颜色度问题并且保存处理后的图片
import time
import numpy as np #计算滑块滑动的距离
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains#模拟按键按下,滑动
brower = webdriver.Chrome()#创建驱动对象

2.定义一个login函数,用来登录界面

def login():
    url = "https://passport.jd.com/new/login.aspx?"
    brower.get(url)
    time.sleep(3)
    userlogin = brower.find_element(By.XPATH,'//div/div[@class="login-tab login-tab-r"]/a').click()

    # time.sleep(5)
    username = brower.find_element(By.ID,"loginname").send_keys('13249300059')
    userpswd = brower.find_element(By.ID,"nloginpwd").send_keys('yao123456')

    # time.sleep(5)
    brower.find_element(By.ID,"loginsubmit").click()
    time.sleep(3)

3.

#背景图
bigimg = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-bigimg"]/img').get_attribute("src")
#滑块图
smallimg = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-smallimg"]/img').get_attribute("src")
#背景图命名
backimg="backimg.png"
#滑块图命名
slideimg='slideimg.png'
#下载图片
request.urlretrieve(bigimg,backimg)
request.urlretrieve(slideimg,smallimg)

#将图片灰度化
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.cvColor(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)


# 获取滑块
element = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-smallimg"]/img')
ActionChains(brower).click_and_hold(on_element=element).perform()
ActionChains(brower).move_to_element_with_offset(to_element=element, xoffset=y-25, yoffset=0).perform()
ActionChains(brower).release(on_element=element).perform()
time.sleep(3)


if __name__ == '__main__':
    login()


  • 为了让程序不断重复运行直到登录成功为止,所以这里需要加一个循环。

3完整代码如下

```
import cv2
import time
import numpy as np
from selenium import webdriver
from urllib import request
from selenium.webdriver.common.action_chains import ActionChains

brower = webdriver.Chrome()


def login():
    url = "https://passport.jd.com/new/login.aspx?"
    brower.get(url)
    time.sleep(3)
    userlogin = brower.find_element(By.XPATH,'//div/div[@class="login-tab login-tab-r"]/a').click()

    # time.sleep(5)
    username = brower.find_element(By.ID,"loginname").send_keys('13249300059')
    userpswd = brower.find_element(By.ID,"nloginpwd").send_keys('yao123456')

    # time.sleep(5)
    brower.find_element(By.ID,"loginsubmit").click()
    time.sleep(3)
    while True:
        try:
            getPic()#执行滑动程序
        except:
            print("登陆成功----")
            break
    time.sleep(5)


def getPic():
    # 用于找到登录图片的大图

    # 用来找到登录图片的小滑块

    bigimg = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-bigimg"]/img').get_attribute("src")#大图
    smallimg = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-smallimg"]/img').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("x方向的偏移", int(y * 0.4 + 18), 'x:', x, 'y:', y)
    # 获取滑块
    element = brower.find_element(By.XPATH,'//div/div[@class="JDJRV-smallimg"]/img')
    ActionChains(brower).click_and_hold(on_element=element).perform()
    ActionChains(brower).move_to_element_with_offset(to_element=element, xoffset=y-25, yoffset=0).perform()
    ActionChains(brower).release(on_element=element).perform()
    time.sleep(3)


    if __name__ == '__main__':
        login()
```

原文地址:http://www.cnblogs.com/beilipython/p/16798857.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性