Selenium利用cookie免登陆音悦台

发布时间:2018-08-20 20:53:15编辑:Run阅读(9327)

    Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能

    利用Cookie可以实现免登陆


    本次实验以:http://www.yinyuetai.com/ 音悦台为例


    打开目标网站,点击登录

    blob.png


    如何获取Cookie信息,方法有很多,可以利用浏览器手动登陆,在Network的Headers里面找到Request Headers,里面就有cookie信息,如下图

    blob.png


    也可以利用抓包工具获取,这里就不多介绍,有兴趣可自行百度

    Selenium也可以获取cookie信息,不过需要利用selenium登陆一次


    利用Selenium登陆音悦台代码如下:

    from selenium import webdriver
    import json
    import time
    
    
    class LoginYinYueTai(object):
        def __init__(self, url, phone_number, password):
            self.url = url
            self.phone_number = phone_number
            self.password = password
            self.browser = self.getbrowser()
            self.run(self.browser)
    
        def getbrowser(self):
            chrome_options = webdriver.ChromeOptions()
            # 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数
            chrome_options.add_argument('headless')
            # 创建chrome无界面对象,设置成无头
            browser = webdriver.Chrome(options=chrome_options,\
                                       executable_path=r'D:\chromedriver_2.41\chromedriver.exe')
            return browser
    
        def run(self, browser):
            # 打开目标网站
            browser.get(self.url)
            # 清楚之前的cookie信息
            browser.delete_all_cookies()
            # 等待js代码加载
            browser.implicitly_wait(10)
            # 找到登陆按钮,点击登录
            browser.find_element_by_xpath("//div[@class='login fr']\
            /a[@class='loginBtn J_login statisEle']").click()
            # 选中弹出框
            browser.current_window_handle
            # 找到输入手机号的input标签,模拟输入手机号
            browser.find_element_by_xpath(
                "//form[@id='login-form']/div[@class='inter-content inter-content-login']\
                //input[@class='login-text-long']").send_keys(self.phone_number)
            # 找到输入密码的input标签,这里匹配上两个标签,所以用elements
            Elements = browser.find_elements_by_xpath("//form[@id='login-form']/div\
            /input[@class='login-text-long']")
            # 找到符合条件的是第二个,模拟输入密码
            Elements[1].send_keys(self.password)
            # 找到登录按钮,并模拟点击登录
            browser.find_element_by_xpath("//form[@id='login-form']//input[@class='login-submit']").click()
            # 设置延迟加载网站内容
            time.sleep(5)
            try:
                # 获取登陆成功后的cookie信息
                login_rear_cookie = browser.get_cookies()
                if login_rear_cookie:
                    # 把cookie信息用json序列化后写入cookie.txt文件
                    with open('cookie.txt', 'w') as f:
                        f.write(json.dumps(login_rear_cookie))
                    print('获取cookie信息成功')
            except Exception as e:
                print('获取cookie失败:{}'.format(e))
            finally:
                # 关闭Chrome浏览器
                browser.quit()
    
    
    if __name__ == '__main__':
        url = 'http://www.yinyuetai.com/'
        phone_number = '手机号'
        password = '密码'
        st = LoginYinYueTai(phone_number=phone_number, password=password, url=url)


    运行程序,会生成一个cookie.txt文件, pycharm截图如下,

    blob.png


    cookie.txt文件里面存放的是cookie信息,如下:

    blob.png


    有了这个cookie.txt文件,就不需要每次都登陆了,下次使用selenium登陆的时候,带上cookie信息,就直接是登陆成功状态


    Selenium添加cookie,实现免登陆

    代码如下:

    from selenium import webdriver
    import json
    import time
    
    
    chrome_options = webdriver.ChromeOptions()
    browser = webdriver.Chrome(options=chrome_options, 
                               executable_path=r'D:\chromedriver_2.41\chromedriver.exe')
    
    # 读取登陆后的cookie.txt文件
    with open('cookie.txt', 'r', encoding='utf8') as f:
        login_rear_cookie_list = json.loads(f.read())
    
    # 清除cookie
    browser.delete_all_cookies()
    
    # 打开目标网站
    browser.get('http://www.yinyuetai.com')
    
    # 添加cookie
    for cookie in login_rear_cookie_list:
        browser.add_cookie(cookie)
    time.sleep(5)
    # 刷新页面 可以看到已登陆状态,已经成功登陆
    browser.refresh()
    time.sleep(10)
    browser.quit()


    运行代码,可以看到用户已登陆成功

    blob.png

关键字