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
。
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 以供以后使用?