• Python Selenium Cookie 绕过验证码实现登录


    Python Selenium Cookie 绕过验证码实现登录

    之前介绍过博客园的通过cookie 绕过验证码实现登录的方法。这里并不多余,会增加分析和另外一种方法实现登录。

    1、思路介绍

    1.1、直接看代码,内有详细注释说明

    # FileName : Wm_Cookie_Login.py
    # Author   : Adil
    # DateTime : 2018/3/20 19:47
    # SoftWare : PyCharm
    
    from selenium import webdriver
    
    import time
    
    url = 'https://system.address'
    
    
    def login():
        '''先定义一个正常登录的方法,获取登录前和登录后的cookie'''
    
        driver = webdriver.Chrome()
    
        driver.get(url)
        driver.maximize_window()
        cookieBefore = driver.get_cookies()
        # 打印登录前的cookie
        print(cookieBefore)
        time.sleep(2)
        driver.find_element_by_id("new-username").clear()
        driver.find_element_by_id("new-username").send_keys("username")
        driver.implicitly_wait(5)
        driver.find_element_by_id("new-password").clear()
        driver.find_element_by_id("new-password").send_keys("password")
        driver.find_element_by_id('home-right-login').click()
        driver.implicitly_wait(5)
        # 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
        time.sleep(5)
        print("登录后!")
        cookiesAfter = driver.get_cookies()
        print("cookiesAfter:")
        print(cookiesAfter)
        # cookie 存放到了list,其中是dict
        # 对比发现登录后的cookie比登录前多了4个dict。
        # 如下代码分别是  1、4 、7、 8 
        len1 = len(cookiesAfter)
        print("len:%d" %len1)
        cookie1 = cookiesAfter[0]
        cookie2 = cookiesAfter[3]
        cookie3 = cookiesAfter[-2]
        cookie4 = cookiesAfter[-1]
        print("cookie1:%s" %cookie1)
        print("cookie2:%s" %cookie2)
        print("cookie3:%s" %cookie3)
        print("cookie4:%s" %cookie4)
        driver.quit()
        # 将获取的这四个cookie作为参数,传递给,使用cookie登录的函数,如下
        cookieLogin(cookie1,cookie2,cookie3,cookie4)
    def cookieLogin(cookie1,cookie2,cookie3,cookie4):
        print("+++++++++++++++++++++++++")
        print("cookieLogin")
        print("cookie2:%s" % cookie2)
        print("cookie4:%s" % cookie4)
        driver = webdriver.Chrome()
        driver.maximize_window()
        # 清除一下cookie
        driver.delete_all_cookies()
        time.sleep(3)
        driver.get(url)
        # 打开浏览器后添加访问地址后,添加cookie
        driver.add_cookie(cookie1)
        driver.add_cookie(cookie2)
        driver.add_cookie(cookie3)
        driver.add_cookie(cookie4)
        print("cookies")
        # 打印一下cookie,与上面正常登录的cookie对比一下
        print(driver.get_cookies())
        time.sleep(5)
        # 刷新页面,可以看到已经是登录状态了,至此完成的使用cookie 的登录。
        driver.refresh()
        time.sleep(5)
        driver.quit()
    
    
    if __name__ == "__main__":
    
        login()

    1.2、代码介绍

    如图,可以查看到登录前与登录后的cookie,将其拷贝出来,进行对比

     如图,对比可以,登录后多余四个cookie

    查看多余cookie的位置,是list 的1、4、7、8g额元素,所以将其取出,作为参数给cookie登录函数。

    注意:该实例介绍的是无验证码登录操作,但思路是一样的。而这个demo ,仅仅是为了介绍一下使用cookie 登录的思路,具体项目应用中,这样是很不方便的。

    2、绕过验证码登录实战

    接下来,介绍含有验证码的登录,当然cookie处理的思路与上介绍的基本一样

    这里增加了几点内容:

      a、先首次使用验证码正确登录并保存登录前、后的cookie,对比分析cookie,筛选有用的cookie

      b、将cookie 写到yaml 文件中,方便后续使用cookie登录时直接使用,而不需像上面介绍的那样,每次都需要先正常登录一样。

      c、使用cookie登录时,从yaml文件中读取对应cookie即可。注意:Yaml 文件操作详见: Python Yaml 学习 ,有详细介绍yaml的读写操作。

      注意:这里介绍的是先手动输入验证码正确登录后获取cookie。实际应用中可以使用其他方式获取cookie

      如:1、之前介绍的博客园登录实例:Python - Cookie绕过验证码登录  使用fiddler,查看cookie

        2、使用浏览器查看cookie 如,借助chrome 插件如下图,导出cookie进行分析。

     思路如上,代码如下:

     2.1、正常登录获取有效cookie

    # FileName : getLoginCookie.py
    # Author   : Adil
    # DateTime : 2018/3/20 21:43
    # SoftWare : PyCharm
    import yaml,time,os
    from selenium import webdriver
    url = 'https://system.address'
    driver = webdriver.Chrome()
    driver.get(url)
    driver.maximize_window()
    time.sleep(2)
    driver.find_element_by_id("username").clear()
    driver.find_element_by_id("username").send_keys("username")
    driver.implicitly_wait(5)
    driver.find_element_by_id("password").clear()
    driver.find_element_by_id("password").send_keys("password")
    print("请输入验证码:")
    # 手动输入验证码
    security_code = input()
    time.sleep(1)
    driver.find_element_by_id("security_code").send_keys(security_code)
    time.sleep(1)
    driver.find_element_by_id('sign_btn').click()
    driver.implicitly_wait(5)
    # 加一个休眠,这样得到的cookie 才是登录后的cookie,否则可能打印的还是登录前的cookie
    time.sleep(5)
    cookiesAfter = driver.get_cookies()
    len1 = len(cookiesAfter)
    # 已经知道需要第几个cookie,这里需要第3个cookie,所以选择cookie下标为2
    cookie1 = cookiesAfter[2]
    # 获取当前文件所在路径
    fileNamePath = os.path.split(os.path.realpath(__file__))[0]
    # 拼接config.yaml文件绝对路径
    yamlPath = os.path.join(fileNamePath,'config.yaml')
    # 以覆盖写入打开文件
    fw = open(yamlPath,'w',encoding='utf-8')
    # 构建数据
    data = {"cookie1":cookie1}
    # 装载写入yaml文件。
    yaml.dump(data,fw)
    
    driver.quit()

     

     2.2、读取cookie配置文件,使用cookie登录系统

    # FileName : stlUseCookieLogin.py
    # Author   : Adil
    # DateTime : 2018/3/20 21:48
    # SoftWare : PyCharm
    from selenium import webdriver
    import time,yaml,os
    url = 'https://system.address'
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.delete_all_cookies()
    time.sleep(3)
    driver.get(url)
    
    fileNamePath = os.path.split(os.path.realpath(__file__))[0]
    yamlPath = os.path.join(fileNamePath,'config.yaml')
    # 读取yaml 文件
    f = open(yamlPath,'r',encoding='utf-8')
    cont = f.read()
    conf = yaml.load(cont)
    # 读取cookie值
    cookie1 = conf.get("cookie1")
    # 添加cookie
    driver.add_cookie(cookie1)
    print("cookies")
    print(driver.get_cookies())
    time.sleep(5)
    # 这里重新获取地址,因为有些系统,未登录状态,链接会跳转,这里就是,登录状态后,才能正确打开指定网址,所以这里要再次指定网址。
    driver.get(url)
    # 刷新查看登录状态
    driver.refresh()
    time.sleep(5)
    driver.quit()

    以上应该算是已经详细的介绍了使用cookie 登录的思路了。有什么问题可以加群沟通,或是关注微信公众号,进行沟通。希望对大家有所帮助。

  • 相关阅读:
    【Python爬虫学习笔记10】多线程中的生产者消费者模式
    【Python爬虫学习笔记9】threading多线程
    【Python爬虫学习笔记8-2】MongoDB数据库操作详解
    【Python爬虫学习笔记8-1】MySQL数据库和MongoDB数据库存储概述
    【Python爬虫学习笔记7】CSV文件存储
    好书一起读(85):算法笔记
    好书一起读(82):电脑的原理
    写个shell脚本
    Scala基础语法
    初识函数式编程的一点漫谈
  • 原文地址:https://www.cnblogs.com/BlueSkyyj/p/8615879.html
Copyright © 2020-2023  润新知