Як зберегти та завантажити файли cookie за допомогою Python + Selenium WebDriver


108

Як я можу зберегти всі файли cookie у Selenium WebDriver Python у txt-файл, а потім завантажити їх пізніше? Документація нічого не говорить про функцію getCookies.

Відповіді:


181

Ви можете зберегти поточні файли cookie як об’єкт python, використовуючи pickle. Наприклад:

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
pickle.dump( driver.get_cookies() , open("cookies.pkl","wb"))

а пізніше, щоб додати їх назад:

import pickle
import selenium.webdriver 

driver = selenium.webdriver.Firefox()
driver.get("http://www.google.com")
cookies = pickle.load(open("cookies.pkl", "rb"))
for cookie in cookies:
    driver.add_cookie(cookie)

1
Я отримую "протокол соління повинен бути помилкою <= 2". Використовуючи розміщений вами код соління. Що це означає? Чи йдеться про аргументи?
Аарон Хінікер

Це зробить те саме? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Аарон Хінікер

1
Привіт Аарон, я трохи змінив зразок - в основному прапор 'b' доданий до відкритих розділів файлу. Ви можете спробувати з цим?
Алі-Акбер Сайфі

Та сама помилка, я не знайомий із солінням, тому не знаю, що це таке. "підвищити ValueError (" протокол маринування повинен бути <=% d "% HIGHEST_PROTOCOL"
Аарон Хінікер,

5
У мене з цим питання. Це добре працює, проте, коли я намагаюся повторити drive.add_cookieт, мені надійшло повідомлення про помилку, в якому сказано, що ключ "термін дії" недійсний. Я використовую Chromeedriver на Mac OS
Solal

56

Коли вам потрібні файли cookie від сеансу до сеансу, є ще один спосіб зробити це, використовуйте параметри Chrome-data-dir-параметри Chrome для використання папок як профілів, я запускаю:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com")

Ви можете зробити тут логіни, які перевіряють взаємодію людини, я це роблю, а потім файли cookie, які мені потрібні зараз кожного разу, коли я запускаю Webdriver з цією папкою, все є там. Ви також можете встановити розширення вручну та мати їх у кожному сеансі. Час, коли я запускаю, всі файли cookie є:

chrome_options = Options()
chrome_options.add_argument("user-data-dir=selenium") 
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get("www.google.com") #Now you can see  the cookies, the settings, extensions, etc, and the logins done in the previous session are present here. 

Перевага полягає в тому, що ви можете використовувати декілька папок з різними налаштуваннями та файлами cookie, розширення без необхідності завантажувати, завантажувати файли cookie, встановлювати та видаляти розширення, змінювати налаштування, змінювати входи через код, і, таким чином, ніяк не порушувати логіку розриву програми, тощо. Це також швидше, ніж Havin, щоб зробити це все за кодом.


4
Це було найкращим рішенням для мене в роботі з логінами Google. У якийсь момент моє використання в розробці було позначене як підозріла діяльність.
Моше

2
@ p1g1n позначено до або після використання цього рішення
Едуард Флоринеску

3
Вибачте, він був позначений перед використанням рішення. Зараз я залишаюсь увійти, щоб не було підозрілої активності.
Моше

2
chrome_options = Options()дає мені name 'Options' is not defined...?
День

4
@Дан вам потрібно:from selenium.webdriver.chrome.options import Options
Едуард Флоринеску

32

Пам'ятайте, що ви можете лише додати cookie для поточного домену. Якщо ви хочете додати файл cookie для свого облікового запису Google, зробіть це

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)

1
Це повинно бути в їхній документації :(
Tjorriemorrie


3
@MauricioCortazar в ньому нічого не сказано про доменну вимогу, про що я мав на увазі
Tjorriemorrie

2
@Tjorriemorrie - це основна людина, файли cookie зберігаються лише в домені, навіть субдомен заборонений
Mauricio Cortazar

1
Цей коментар здається релевантним, коли мова йде про кілька доменів, які використовують файл cookie з кореневого домену. Наприклад, google.com може бути кореневим доменом, а інший домен чи піддомен, що належить Google, може використовувати той самий файл cookie. Мені подобається рішення від @Eduard Florinescu краще через це (та інші причини), оскільки воно не потребує використання browser.get перед завантаженням файлів cookie, вони просто є вже з даних даних. Здається, тут потрібен додатковий браузер.get перед завантаженням файлу cookie (відповідно до цього коментаря), хоча він не перевіряв його.
Roel Van de Paar

12

На основі відповіді @Eduard Florinescu, але додано новіший код та відсутній імпорт:

$ cat work-auth.py 
#!/usr/bin/python3

# Setup:
# sudo apt-get install chromium-chromedriver
# sudo -H python3 -m pip install selenium

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
chrome_options.add_argument("user-data-dir=chrome-data") 
driver.get('https://www.somedomainthatrequireslogin.com')
time.sleep(30)  # Time to enter credentials
driver.quit()

$ cat work.py 
#!/usr/bin/python3

import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('/usr/bin/chromedriver',options=chrome_options)
driver.get('https://www.somedomainthatrequireslogin.com')  # Already authenticated
time.sleep(10)
driver.quit()

3
Мариновані речі для мене не спрацювали. (Це вже другий раз, коли я намагався його використовувати.) Тому я застосував ваш метод, який спочатку також не працював для мене. Зміни, які мені довелося внести: мені довелося вводити chrome_options.add_argument ('no-sandbox') через проблему, задокументовану на github.com/theintern/intern/isissue/878, і мені довелося зробити повний шлях користувача-даних-dir в моєму середовищі Windows 10.
Ерік

Не працює для мого веб-сайту, який зберігає дані про автентифікацію у
файлах

12

Просто невелика модифікація коду, написаного @Roel Van de Paar, оскільки вся заслуга йому належить. Я використовую це в Windows, і він прекрасно працює, як для налаштування, так і для додавання файлів cookie:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--user-data-dir=chrome-data")
driver = webdriver.Chrome('chromedriver.exe',options=chrome_options)
driver.get('https://web.whatsapp.com')  # Already authenticated
time.sleep(30)

2
Працює чудово! Дякуємо за публікацію коду для Windows! Ти врятував мій день!
Анатоль

Дякую! Настільки просто, і це мене на деякий час ганяло. Голосувати за всіх! :)
MT

0

це код, який я використовував у Windows, він працює.

 for item in COOKIES.split(';'):
            name,value = item.split('=',1)
            name=name.replace(' ','').replace('\r','').replace('\n','')
            value = value.replace(' ','').replace('\r','').replace('\n','')
            cookie_dict={  
                    'name':name,
                    'value':value,
                    "domain": "",  # google chrome
                    "expires": "",
                    'path': '/',
                    'httpOnly': False,
                    'HostOnly': False,
                    'Secure': False
                    }
            self.driver_.add_cookie(cookie_dict)

-2

мій ОС - це Windows 10, а хромована версія - 75.0.3770.100. Я спробував рішення "user-data-dir", не вийшло. спробувати рішення @ Еріка Клієна теж не вдається. нарешті, я роблю параметр хрому, як на малюнку, він працює! Але він не працював на Windows Server 2012.

налаштування

введіть тут опис зображення


4
Здається, PNG є не такою звичною мовою, як англійська. Будь ласка, переконайтеся, що ви публікуєте лише англійською мовою.
amonk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.