Как сохранять и загружать файлы cookie с помощью Python + Selenium WebDriver

109

Как я могу сохранить все файлы cookie в Selenium WebDriver Python в txt-файл, а затем загрузить их позже? В документации ничего не говорится о функции getCookies.

Аарон Хиникер
источник

Ответы:

184

Вы можете сохранить текущие файлы 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» добавлен в открытые разделы файла. Можешь попробовать с этим?
Али-Акбер Сайфи
Та же ошибка, я не знаком с рассолом, поэтому не уверен, что это такое. "raise ValueError (" протокол рассола должен быть <=% d "% HIGHEST_PROTOCOL"
Аарон Хиникер
5
У меня проблема с этим. Он работает нормально, однако, когда я пытаюсь сделать это drive.add_cookieснова, я получаю сообщение об ошибке, в котором говорится, что ключ «срок действия» недействителен. Я использую chromedriver в Mac OS
Solal
56

Когда вам нужны файлы cookie от сеанса к сеансу, есть другой способ сделать это, используя параметры Chrome user-data-dir, чтобы использовать папки в качестве профилей, я запускаю:

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 с этой папкой, все там есть. Вы также можете вручную установить расширения и использовать их в каждом сеансе. В следующий раз, когда я бегу, все куки есть:

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, устанавливать и удалять расширения, изменять настройки, изменять логины с помощью кода и, следовательно, не иметь возможности иметь логику прерывания программы, и т.д. Также это быстрее, чем делать все с помощью кода.

Эдуард Флоринеску
источник
4
Это было лучшее решение для меня, когда я имел дело с логинами Google. В какой-то момент мое использование в разработке было отмечено как подозрительное действие.
Моше Штаубер
2
@ p1g1n был отмечен до или после использования этого решения
Эдуард Флоринеску
3
Извините, он был отмечен перед использованием решения. Теперь я остаюсь в системе, поэтому никаких подозрительных действий нет.
Моше Штаубер
2
chrome_options = Options()дает мне name 'Options' is not defined...?
Дэн
4
@Dan, вам нужно:from selenium.webdriver.chrome.options import Options
Эдуард Флоринеску
32

Помните, что вы можете добавить cookie только для текущего домена. Если вы хотите добавить файл cookie для своей учетной записи Google, сделайте

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Exsonic
источник
1
Это должно быть в их документации :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/…
Маурисио Кортасар,
3
@MauricioCortazar ничего не говорит о требованиях к домену, о чем я имел в виду
Tjorriemorrie
2
@Tjorriemorrie, это простой человек, файлы cookie хранятся только в домене, даже субдомен не разрешен
Маурисио Кортасар
1
Этот комментарий кажется уместным, когда речь идет о нескольких доменах, использующих cookie из корневого домена. Например, google.com может быть корневым доменом, а другой домен или субдомен, принадлежащий Google, может использовать тот же файл cookie. Мне больше нравится решение @Eduard Florinescu из-за этого (и других причин), поскольку оно не требует использования browser.get перед загрузкой файлов cookie, они просто уже есть из каталога данных. Кажется, здесь требуется дополнительный browser.get перед загрузкой файла cookie (согласно этому комментарию), хотя мы не тестировали его.
Роэль Ван де Паар
13

На основе ответа @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/issues/878, и мне пришлось сделать user-data-dir полным путем в моей среде Windows 10.
Эрик Клиен
Не работает на моем сайте , что хранит данные аутентификации в печенье
Wildhammer
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

это код, который я использовал в окнах, он работает.

 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)
ты
источник
-3

моя ОС - Windows 10, а версия для Chrome - 75.0.3770.100. Я пробовал решение «user-data-dir», не сработало. попробуйте решение @ Eric Klien тоже не удается. наконец, я делаю настройку хрома, как на картинке, она работает! но она не работает на сервере Windows 2012.

установка

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

боевой
источник
6
png кажется на менее знакомом языке, чем английский. Пожалуйста, убедитесь, что вы публикуете только на английском языке.
amonk