Python:使用Cookie登录Selenium

L'u*_*imo 7 python selenium

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

据我了解,我必须使用cookie,问题是我不知道如何使用。

我尝试使用以下方法下载YouTube Cookie:

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

我得到的是:

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

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

Jul*_*Wgs 12

我建议使用 json 格式,因为 cookie 本质上是字典和列表。否则这就是批准的答案

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)
Run Code Online (Sandbox Code Playgroud)

  • 此外,正如 Python 文档 (https://docs.python.org/3/library/pickle.html) 中所述,pickle 模块并不安全,因为有可能构建恶意的 pickle 数据,该数据将在 unpickle 期间执行任意代码。 (3认同)

Aro*_*unt 8

您可以pickle用来将Cookie保存为文本文件,并在以后加载:

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)
Run Code Online (Sandbox Code Playgroud)

  • @DannyWatson也许你应该尝试理解而不是复制意大利面。这可能会引导您找到解决方案。代码不是通过浏览 stackoverflow 来获取的。哦/ (2认同)

Har*_*gar 7

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

\n

我已经尝试了博客和 StackOverflow 答案中的大量解决方案。

\n1. 使用用户数据目录和配置文件目录\n

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

\n2. 使用 cookie\n

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

\n

代码

\n
# selenium-driver.py\nimport pickle\nfrom selenium import webdriver\n\n\nclass SeleniumDriver(object):\n    def __init__(\n        self,\n        # chromedriver path\n        driver_path='/Users/username/work/chrome/chromedriver',\n        # pickle file path to store cookies\n        cookies_file_path='/Users/username/work/chrome/cookies.pkl',\n        # list of websites to reuse cookies with\n        cookies_websites=["https://facebook.com"]\n\n    ):\n        self.driver_path = driver_path\n        self.cookies_file_path = cookies_file_path\n        self.cookies_websites = cookies_websites\n        chrome_options = webdriver.ChromeOptions()\n        self.driver = webdriver.Chrome(\n            executable_path=self.driver_path,\n            options=chrome_options\n        )\n        try:\n            # load cookies for given websites\n            cookies = pickle.load(open(self.cookies_file_path, "rb"))\n            for website in self.cookies_websites:\n                self.driver.get(website)\n                for cookie in cookies:\n                    self.driver.add_cookie(cookie)\n                self.driver.refresh()\n        except Exception as e:\n            # it'll fail for the first time, when cookie file is not present\n            print(str(e))\n            print("Error loading cookies")\n\n    def save_cookies(self):\n        # save cookies\n        cookies = self.driver.get_cookies()\n        pickle.dump(cookies, open(self.cookies_file_path, "wb"))\n\n    def close_all(self):\n        # close all open tabs\n        if len(self.driver.window_handles) < 1:\n            return\n        for window_handle in self.driver.window_handles[:]:\n            self.driver.switch_to.window(window_handle)\n            self.driver.close()\n\n    def quit(self):\n        self.save_cookies()\n        self.close_all()\n\n\ndef is_fb_logged_in():\n    driver.get("https://facebook.com")\n    if 'Facebook \xe2\x80\x93 log in or sign up' in driver.title:\n        return False\n    else:\n        return True\n\n\ndef fb_login(username, password):\n    username_box = driver.find_element_by_id('email')\n    username_box.send_keys(username)\n\n    password_box = driver.find_element_by_id('pass')\n    password_box.send_keys(password)\n\n    login_box = driver.find_element_by_id('loginbutton')\n    login_box.click()\n\n\nif __name__ == '__main__':\n    """\n    Run  - 1\n    First time authentication and save cookies\n\n    Run  - 2\n    Reuse cookies and use logged-in session\n    """\n    selenium_object = SeleniumDriver()\n    driver = selenium_object.driver\n    username = "fb-username"\n    password = "fb-password"\n\n    if is_fb_logged_in(driver):\n        print("Already logged in")\n    else:\n        print("Not logged in. Login")\n        fb_login(username, password)\n\n    selenium_object.quit()\n
Run Code Online (Sandbox Code Playgroud)\n

运行 1:登录并保存 Cookie

\n
$ python selenium-driver.py\n[Errno 2] No such file or directory: '/Users/username/work/chrome/cookies.pkl'\nError loading cookies\nNot logged in. Login\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n
$ python selenium-driver.py\nAlready logged in\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

要求

\n
    \n
  • Python 3.7
  • \n
  • 硒网络驱动程序
  • \n
  • 泡菜
  • \n
\n