selenium模拟淘宝登陆,过所有验证

淘宝模拟登陆实现

由于淘宝使用了滑动验证码,需要进行模糊手动滑动,因此考虑使用selenium+chromedriver进行模拟登陆。
淘宝的登陆网址:https://login.taobao.com/member/login.jhtml

项目运行准备:

安装python3开发环境,官网自行下载,博主版本为3.7
安装chrome游览器,下载地址:https://www.google.cn/chrome/
安装selenium模块,在终端中输入pip3 install selenium
安装chromedriver驱动,下载地址:http://npm.taobao.org/mirrors/chromedriver/
注意:

  • 在下载chromedriver驱动的时候,需要与chrome游览器的版本尽量保持一致,查看chrome游览器版本方法,在谷歌游览器访问:chrome://settings/help这个网址

项目需要使用的所有模块

import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

初始化selenium并加载chromedriver驱动

class TB(object):
    def __init__(self, *args, **kwargs):
        """
        初始化游览器版本
        """
        option = webdriver.ChromeOptions()
        self.webdriver_obj = webdriver.Chrome(executable_path='chromedriver.exe', chrome_options=option)
        # 跳过阿里滑动验证码对selenium的校验
        self.webdriver_obj.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
            "source": '''
            Object.defineProperty(navigator, 'webdriver', {
              get: () => undefined
            })
          '''
        })

封装隐式等待进行xpath定位

由于selenium隐式等待进行xpath定位找不到会报错,项目中多次使用这一段代码,因此对这一部分代码进行封装,封装之后的代码如下:

def xpath(self, xpath_bas):
      try:
          element = WebDriverWait(self.webdriver_obj, 10).until(
              EC.presence_of_element_located((By.XPATH, xpath_bas))
          )
      except:
          element = []
      finally:
          return element

进行登录标签的定位,输入账号,密码操作

    def login(self,username='', password=''):
        url = 'https://login.taobao.com/member/login.jhtml'
        self.webdriver_obj.get(url)
        self.xpath('//*[@id="fm-login-id"]').send_keys(username)  # 定位账号输入框,并输入账号
        self.xpath('//*[@id="fm-login-password"]').send_keys(password)  # 定位密码输入框,并输入密码
        self.xpath('//*[@id="login-form"]/div[4]/button').click()  # 第一次点击登录按钮
        time.sleep(5)  
        check_yzm_span = self.xpath('//*[@id="nc_1_n1z"]')  # 延时定位滑动验证码标签,避免点击登录按钮之后,出现滑动验证码,不需要验证的情况
        if bool(check_yzm_span):
            print('登录发现滑动验证码')
            self.check_yzm(check_yzm_span)  # 处理滑动验证码
        else:
            print('登录未发现滑动验证码')
        try:
            frame = self.xpath('//*[@id="content"]/div/div[1]/iframe')  # 定位iframe标签,由于iframe没有id,name这种唯一的属性,因此只能通过先定位,在切换实现
            self.webdriver_obj.switch_to.frame(frame)  # 由于手机验证页面出现了页面的嵌套,因此需要进行页面跳转到iframe下
            check_phone_button = self.xpath('//*[@id="J_GetCode"]')
            print('登录发现手机验证码')
            self.check_phone_yzm(check_phone_button)  # 处理手机登录验证码
        except:
            print('登录未发现手机验证码')
        finally:
            print('登陆成功')

处理滑动验证码

定位到滑块的标签

定位滑动槽的标签

通过定位发现滑动槽的长度是300,滑块的长度是40,因此需要滑动的距离大约是260.
因此可以通过ActionChains动作链实现对滑动的拖动操作,具体代码如下:

    def check_yzm(self, check_yzm_span):
        """
        处理滑动验证码,没有测试
        :param check_yzm_span:
        :return:
        """
        # 实例化一个动作链关联游览器
        action = ActionChains(self.webdriver_obj)
        # 使用鼠标动作链进行点击并悬浮
        action.click_and_hold(check_yzm_span)
        # 滑动验证码
        action.move_by_offset(xoffset=258, yoffset=0).perform()
        time.sleep(1)
        # 再次点击登录按钮
        self.xpath('//*[@id="login-form"]/div[4]/button').click()

处理手机验证码

在点击登录之后,淘宝会进行身份验证,就是让你输入手机验证码,然后对验证码进行输入后,才能让你登录成功。

发现,淘宝这个页面出现了页面的嵌套,并且iframe没有id,name这样唯一的属性值,因此只能通过先对iframe标签进行定位,然后通过switch_to进行页面的切换。
切换页面之后,剩下的思路就是点击获取验证码按钮,输入验证码,点击确认按钮。具体实现代码如下:

    def check_phone_yzm(self, check_phone_button):
        check_phone_button.click()
        yzm = input('请输入手机验证码:')
        self.xpath('//*[@id="J_Phone_Checkcode"]').send_keys(yzm)
        self.xpath('//*[@id="submitBtn"]').click()

最后登陆成功之后的截图如下:

posted @ 2020-12-09 15:30  Dog.泰迪  阅读(3345)  评论(1编辑  收藏  举报