Python:使用 cookie 登录 Selenium

Posted

技术标签:

【中文标题】Python:使用 cookie 登录 Selenium【英文标题】:Python: use cookie to login with Selenium 【发布时间】:2018-01-07 02:40:16 【问题描述】:

我想做的是打开一个页面(例如 youtube)并自动登录,就像我在浏览器中手动打开它一样。

据我了解,我必须使用cookies,问题是我不明白如何。

我尝试用这个下载 youtube cookie:

driver = webdriver.Firefox(executable_path="driver/geckodriver.exe")
driver.get("https://www.youtube.com/")
print(driver.get_cookies())

我得到的是:

'name': 'VISITOR_INFO1_LIVE', 'value': 'EDkAwwhbDKQ', 'path': '/', 'domain': '.youtube.com', 'expiry': None, 'secure': False , 'httpOnly': 真

那么我必须加载什么 cookie 才能自动登录?

【问题讨论】:

我认为您可以将 cookie 保存到文件中然后加载它 这能回答你的问题吗? How to save and load cookies using Python + Selenium WebDriver 【参考方案1】:

您可以使用pickle 将cookies 保存为文本文件并稍后加载:

def save_cookie(driver, path):
    with open(path, 'wb') as filehandler:
        pickle.dump(driver.get_cookies(), filehandler)

def load_cookie(driver, path):
     with open(path, 'rb') as cookiesfile:
         cookies = pickle.load(cookiesfile)
         for cookie in cookies:
             driver.add_cookie(cookie)

【讨论】:

好的,所以我手动登录并保存了 cookie,现在我必须在代码的哪一部分加载它们?我试图在 driver.get() 之后加载它们,但没有任何反应。 在大多数情况下,您必须:1. 转到主页(必须是同一域内的页面),2. 加载 cookie,3. 刷新页面 @Arount,“1.转到主页”是什么意思?谢谢。 @RatmirAsanov 您必须加载与您要访问的页面相同域的页面。通常我使用主页,即“索引”。 @DannyWatson 也许您应该尝试理解而不是复制意大利面。这可能会导致您找到解决方案。代码不是通过浏览***来维护的。 o/【参考方案2】:

我建议使用 json 格式,因为 cookie 本质上是字典和列表。否则这是approved answer。

import json

def save_cookie(driver, path):
    with open(path, 'w') as filehandler:
        json.dump(driver.get_cookies(), filehandler)

def load_cookie(driver, path):
    with open(path, 'r') as cookiesfile:
        cookies = json.load(cookiesfile)
    for cookie in cookies:
        driver.add_cookie(cookie)

【讨论】:

【参考方案3】:

我曾经遇到过同样的问题。最后我使用 chromeoptions 来解决这个问题,而不是 cookie 文件。

    import getpass

    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_argument("user-data-dir=C:\\Users\\"+getpass.getuser()+"\\AppData\\Local\\Google\\Chrome\\User Data\\Default")  # this is the directory for the cookies

    driver = webdriver.Chrome(chrome_options=chrome_options)
    driver.get(url)

【讨论】:

它对我不起作用。它只是表现得很奇怪。首先它会去google.com,5秒后去我的链接,也没有自动登录...... 它也不适合我。我正在使用 Ubuntu 并提供以下路径 chrome_options.add_argument("user-data-dir=~/.config/google-chrome/Default/Cookies") 但仍然没有任何反应,它需要登录【参考方案4】:

我有一个场景,我想重用一次经过身份验证/登录的会话。我同时使用多个浏览器。

我从博客和 *** 答案中尝试了很多解决方案。

1. 使用 user-data-dir 和 profile-directory

如果您一次打开一个浏览器,这些 chrome 选项可以解决问题,但如果您打开多个窗口,它会抛出错误提示 user data directory is already in use

2. 使用 cookie

Cookie 可以在多个浏览器之间共享。 SO答案中可用的代码具有有关如何在硒中使用cookie的大部分重要块。在这里,我将扩展这些解决方案以完成流程。

代码

# selenium-driver.py
import pickle
from selenium import webdriver


class SeleniumDriver(object):
    def __init__(
        self,
        # chromedriver path
        driver_path='/Users/username/work/chrome/chromedriver',
        # pickle file path to store cookies
        cookies_file_path='/Users/username/work/chrome/cookies.pkl',
        # list of websites to reuse cookies with
        cookies_websites=["https://facebook.com"]

    ):
        self.driver_path = driver_path
        self.cookies_file_path = cookies_file_path
        self.cookies_websites = cookies_websites
        chrome_options = webdriver.ChromeOptions()
        self.driver = webdriver.Chrome(
            executable_path=self.driver_path,
            options=chrome_options
        )
        try:
            # load cookies for given websites
            cookies = pickle.load(open(self.cookies_file_path, "rb"))
            for website in self.cookies_websites:
                self.driver.get(website)
                for cookie in cookies:
                    self.driver.add_cookie(cookie)
                self.driver.refresh()
        except Exception as e:
            # it'll fail for the first time, when cookie file is not present
            print(str(e))
            print("Error loading cookies")

    def save_cookies(self):
        # save cookies
        cookies = self.driver.get_cookies()
        pickle.dump(cookies, open(self.cookies_file_path, "wb"))

    def close_all(self):
        # close all open tabs
        if len(self.driver.window_handles) < 1:
            return
        for window_handle in self.driver.window_handles[:]:
            self.driver.switch_to.window(window_handle)
            self.driver.close()

    def quit(self):
        self.save_cookies()
        self.close_all()


def is_fb_logged_in():
    driver.get("https://facebook.com")
    if 'Facebook – log in or sign up' in driver.title:
        return False
    else:
        return True


def fb_login(username, password):
    username_box = driver.find_element_by_id('email')
    username_box.send_keys(username)

    password_box = driver.find_element_by_id('pass')
    password_box.send_keys(password)

    login_box = driver.find_element_by_id('loginbutton')
    login_box.click()


if __name__ == '__main__':
    """
    Run  - 1
    First time authentication and save cookies

    Run  - 2
    Reuse cookies and use logged-in session
    """
    selenium_object = SeleniumDriver()
    driver = selenium_object.driver
    username = "fb-username"
    password = "fb-password"

    if is_fb_logged_in(driver):
        print("Already logged in")
    else:
        print("Not logged in. Login")
        fb_login(username, password)

    selenium_object.quit()

运行 1:登录并保存 Cookies

$ python selenium-driver.py
[Errno 2] No such file or directory: '/Users/username/work/chrome/cookies.pkl'
Error loading cookies
Not logged in. Login

这将打开 facebook 登录窗口并输入用户名密码登录。登录后,它会关闭浏览器并保存 cookie。

运行 2:重用 cookie 以继续登录会话

$ python selenium-driver.py
Already logged in

这将使用存储的 cookie 打开登录的 facebook 会话。

要求

Python 3.7 Selenium 网络驱动程序 泡菜

【讨论】:

【参考方案5】:

试试这个,有一种方法可以将 cookie 添加到您的驱动程序会话中

http://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.add_cookie

【讨论】:

我什么时候必须在代码中添加它们?我在 driver-get() 之后尝试过,但没有任何反应。 我认为驱动程序需要在页面中才能加载 cookie。尝试获取 Google.com ,然后加载 cookie,然后获取目标 url【参考方案6】:

这是一种可能的解决方案

import pickle
from selenium import webdriver

def save_cookie(driver):
    with open("cookie", 'wb') as filehandler:
        pickle.dump(driver.get_cookies(), filehandler)
def load_cookie(driver):
     with open("cookie", 'rb') as cookiesfile:
         cookies = pickle.load(cookiesfile)
         for cookie in cookies:
             print(cookie)
             driver.add_cookie(cookie)

driver = webdriver.Chrome(ChromeDriverManager().install())
url = 'https://www.Youtube.com'
driver.get(url)
#first try to login and generate cookies after that you can use cookies to login eveytime 
load_cookie(driver)
# Do you task here 
save_cookie(driver)
driver.quit()

【讨论】:

以上是关于Python:使用 cookie 登录 Selenium的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫+使用cookie登录豆瓣

Python:使用 cookie 登录 Selenium

Python网络爬虫---使用已登录的cookie访问需要登录的网页

如何使用 Python 登录网页并检索 cookie 以供以后使用?

python 脚本模拟登录后注销操作,使用登录时的cookies,注销时仍提示未登录

selenium:python如何绕过登录页面登录网页