Jak zapisywać i ładować pliki cookie za pomocą Python + Selenium WebDriver

109

Jak mogę zapisać wszystkie pliki cookie w Selenium WebDriver Pythona do pliku txt, a następnie załadować je później? Dokumentacja niewiele mówi o funkcji getCookies.

Aaron Hiniker
źródło

Odpowiedzi:

184

Możesz zapisać aktualne pliki cookie jako obiekt Pythona za pomocą pickle. Na przykład:

import pickle
import selenium.webdriver 

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

a później, aby dodać je z powrotem:

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)
Ali-Akber Saifee
źródło
1
Otrzymuję błąd „protokół pikle musi być <= 2”. Używając przesłanego przez Ciebie kodu marynat. Co to znaczy? Czy odnosi się do argumentów?
Aaron Hiniker,
Czy zrobiłoby to to samo? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker
1
Cześć Aaron, trochę zmodyfikowałem próbkę - w zasadzie flaga 'b' dodana do sekcji otwartych plików. Możesz z tym spróbować?
Ali-Akber Saifee
Ten sam błąd, nie znam marynaty, więc nie jestem pewien, co to jest. "raise ValueError (" protokół pikle musi być <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker,
5
Mam z tym problem. Działa dobrze, jednak gdy próbuję drive.add_cookieponownie t, pojawia się komunikat o błędzie informujący, że klucz „wygaśnięcia” jest nieprawidłowy. Używam chromedriver w systemie Mac OS
Solal
56

Kiedy potrzebujesz plików cookie z sesji na sesję, jest inny sposób, aby to zrobić, użyj opcji Chrome options user-data-dir, aby używać folderów jako profili, uruchamiam:

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

Możesz tutaj logować się, aby sprawdzić interakcję człowieka. Robię to, a następnie potrzebuję plików cookie za każdym razem, gdy uruchamiam Webdriver z tym folderem, wszystko tam jest. Możesz także ręcznie zainstalować rozszerzenia i mieć je w każdej sesji. Gdy uruchamiam, wszystkie pliki cookie są tam:

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. 

Zaletą jest to, że możesz korzystać z wielu folderów z różnymi ustawieniami i plikami cookie, Rozszerzenia bez konieczności ładowania, wyładowywania plików cookie, instalowania i odinstalowywania rozszerzeń, zmiany ustawień, zmiany logowań za pomocą kodu, a tym samym nie ma możliwości, aby logika programu się zepsuła, itd. Jest to również szybsze niż robienie tego wszystkiego za pomocą kodu.

Eduard Florinescu
źródło
4
To było dla mnie najlepsze rozwiązanie w przypadku logowania do Google. W pewnym momencie moje użycie programistyczne zostało oznaczone jako podejrzana aktywność.
Moshe Stauber
2
@ p1g1n został oflagowany przed lub po użyciu tego rozwiązania
Eduard Florinescu
3
Przepraszamy, zostało to oznaczone przed użyciem rozwiązania. Teraz jestem zalogowany, więc nie ma podejrzanej aktywności.
Moshe Stauber
2
chrome_options = Options()daje mi name 'Options' is not defined...?
Dan
4
@Dan, musisz:from selenium.webdriver.chrome.options import Options
Eduard Florinescu
32

Pamiętaj, że możesz dodać plik cookie tylko dla bieżącej domeny. Jeśli chcesz dodać plik cookie do swojego konta Google, zrób

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Exsonic
źródło
1
To powinno być w ich dokumentacji :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/ ...
Mauricio Cortazar
3
@MauricioCortazar nic nie mówi o wymogu domeny, o czym mówiłem
Tjorriemorrie
2
@Tjorriemorrie to podstawowy człowiek, tylko ciasteczka są przechowywane w domenie, nawet subdomena nie jest dozwolona
Mauricio Cortazar
1
Ten komentarz wydaje się odpowiedni, jeśli chodzi o wiele domen używających pliku cookie z domeny głównej. Na przykład google.com może być domeną główną, a inna domena lub subdomena należąca do Google może używać tego samego pliku cookie. Rozwiązanie autorstwa @Eduard Florinescu podoba mi się bardziej z tego powodu (i innych powodów), ponieważ nie wymaga korzystania z browser.get przed załadowaniem ciasteczek, po prostu są tam już z katalogu danych. Wygląda na to, że dodatkowy plik browser.get jest tutaj wymagany przed załadowaniem pliku cookie (zgodnie z tym komentarzem), ale nie przetestował go.
Roel Van de Paar
13

Na podstawie odpowiedzi @Eduard Florinescu, ale z nowszym kodem i dodanym brakującym importem:

$ 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()
Roel Van de Paar
źródło
3
Pikle na mnie nie działały. (To już drugi raz, kiedy go próbowałem.) Więc użyłem twojej metody, która też na początku nie działała. Zmiany, które musiałem wprowadzić: musiałem wpisać chrome_options.add_argument ('no-sandbox') z powodu problemu udokumentowanego na github.com/theintern/intern/issues/878 i musiałem ustawić pełną ścieżkę do user-data-dir w moim środowisku Windows 10.
Eric Klien
Nie działa na mojej stronie internetowej, która przechowuje dane uwierzytelniające w
plikach
12

Tylko niewielka modyfikacja kodu napisanego przez @Roel Van de Paar, ponieważ cała zasługa jego. Używam tego w systemie Windows i działa doskonale, zarówno do ustawiania, jak i dodawania plików 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)
Jagadeeswara Reddy P
źródło
2
Działa świetnie! Dziękujemy za przesłanie kodu dla systemu Windows! Uratowałeś mi dzień!
Anatol
Dzięki! Takie proste i przez jakiś czas doprowadzało mnie to do szału. Głosy pozytywne dla wszystkich! :)
MT
0

to jest kod, którego użyłem w systemie Windows, działa.

 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)
yong you
źródło
-3

mój system operacyjny to Windows 10, a wersja Chrome to 75.0.3770.100. Wypróbowałem rozwiązanie „user-data-dir”, ale nie zadziałało. wypróbuj rozwiązanie @ Eric Klien też zawodzi. na koniec ustawiam chrome tak, jak na zdjęciu, działa! ale nie działa na serwerze Windows 2012.

oprawa

wprowadź opis obrazu tutaj

Battlesteed
źródło
6
png wydaje się być w nie tak znanym języku jak angielski. Upewnij się, że publikujesz tylko w języku angielskim.
amonk