Speichern und Laden von Cookies mit Python + Selenium WebDriver

106

Wie kann ich alle Cookies in Pythons Selenium WebDriver in einer txt-Datei speichern und später laden? Die Dokumentation sagt nicht viel über die Funktion getCookies aus.

Aaron Hiniker
quelle

Antworten:

177

Sie können die aktuellen Cookies mit pickle als Python-Objekt speichern. Beispielsweise:

import pickle
import selenium.webdriver 

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

und später, um sie wieder hinzuzufügen:

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
quelle
1
Ich erhalte den Fehler "Pickle-Protokoll muss <= 2 sein". Verwenden Sie den von Ihnen geposteten Pickle-Code. Was bedeutet das? Bezieht es sich auf die Argumente?
Aaron Hiniker
Würde das das Gleiche tun? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker
1
Hallo Aaron, ich habe das Beispiel ein wenig modifiziert - im Grunde genommen das 'b'-Flag, das zu den geöffneten Abschnitten der Datei hinzugefügt wurde. Kannst du das versuchen?
Ali-Akber Saifee
Gleicher Fehler, ich bin nicht mit Gurke vertraut, daher bin ich mir nicht sicher, was es ist. "Raise ValueError (" Pickle-Protokoll muss <=% d sein "% HIGHEST_PROTOCOL"
Aaron Hiniker
5
Ich habe ein Problem damit. Es funktioniert einwandfrei, aber wenn ich es drive.add_cookieerneut versuche, wird eine Fehlermeldung angezeigt, dass der Schlüssel "Ablauf" ungültig ist. Ich benutze Chromedriver unter Mac OS
Solal
53

Wenn Sie von Sitzung zu Sitzung Cookies benötigen, gibt es eine andere Möglichkeit. Verwenden Sie die Chrome-Optionen Benutzerdatenverzeichnis, um Ordner als Profile zu verwenden.

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

Sie können hier die Anmeldungen vornehmen, die auf menschliche Interaktion prüfen. Ich mache dies und dann die Cookies, die ich jetzt jedes Mal benötige, wenn ich den Webdriver mit diesem Ordner starte. Alles ist dort. Sie können die Erweiterungen auch manuell installieren und in jeder Sitzung verwenden. Sekunden nachdem ich gelaufen bin, sind alle Cookies da:

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. 

Der Vorteil ist, dass Sie mehrere Ordner mit unterschiedlichen Einstellungen und Cookies verwenden können. Erweiterungen ohne Laden, Entladen von Cookies, Installieren und Deinstallieren von Erweiterungen, Ändern von Einstellungen, Ändern von Anmeldungen per Code und somit keine Möglichkeit, die Logik der Programmunterbrechung zu ändern. usw. Auch dies ist schneller als alles, um alles per Code zu erledigen.

Eduard Florinescu
quelle
4
Dies war die beste Lösung für mich beim Umgang mit Google-Logins. Irgendwann wurde meine Entwicklungsnutzung als verdächtige Aktivität gekennzeichnet.
Moshe Stauber
2
@ p1g1n wurde vor oder nach der Verwendung dieser Lösung markiert
Eduard Florinescu
3
Entschuldigung, es wurde vor der Verwendung der Lösung markiert. Jetzt bleibe ich eingeloggt, damit keine verdächtigen Aktivitäten stattfinden.
Moshe Stauber
2
chrome_options = Options()gibt mir name 'Options' is not defined...?
Dan
4
@Dan müssen Sie:from selenium.webdriver.chrome.options import Options
Eduard Florinescu
32

Denken Sie daran, dass Sie nur ein Cookie für die aktuelle Domain hinzufügen können. Wenn Sie ein Cookie für Ihr Google-Konto hinzufügen möchten, tun Sie dies

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Exsonic
quelle
1
Dies sollte in ihrer Dokumentation sein :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/...
Mauricio Cortazar
3
@ MauricioCortazar es sagt nichts über die Domain-Anforderung, auf die ich mich bezog
Tjorriemorrie
2
@ Tjorriemorrie das ist einfacher Mann, die Cookies werden nur in der Domain gespeichert, auch Subdomain sind nicht erlaubt
Mauricio Cortazar
1
Dieser Kommentar scheint relevant zu sein, wenn mehrere Domains mit einem Cookie aus einer Root-Domain behandelt werden. Beispielsweise könnte google.com die Root-Domain sein, und eine andere Domain oder Subdomain von Google könnte dasselbe Cookie verwenden. Ich mag die Lösung von @Eduard Florinescu aus diesem (und anderen Gründen) besser, da es nicht erforderlich ist, das browser.get vor dem Laden von Cookies zu verwenden, sie sind nur bereits aus dem Datenverzeichnis vorhanden. Es scheint, dass das zusätzliche browser.get hier erforderlich ist, bevor die Cookie-Datei geladen wird (gemäß diesem Kommentar), obwohl es nicht getestet wurde.
Roel Van de Paar
12

Basierend auf der Antwort von @Eduard Florinescu, aber mit neuerem Code und fehlendem Import hinzugefügt:

$ 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
quelle
3
Das Gurkenmaterial hat bei mir nicht funktioniert. (Dies ist das zweite Mal, dass ich es ausprobiert habe.) Also habe ich Ihre Methode verwendet, die bei mir zunächst auch nicht funktioniert hat. Änderungen, die ich vornehmen musste: Ich musste chrome_options.add_argument ('no-sandbox') eingeben, da das Problem unter github.com/theintern/intern/issues/878 dokumentiert war, und ich musste user-data-dir zu einem vollständigen Pfad machen in meiner Windows 10-Umgebung.
Eric Klien
Funktioniert nicht für meine Website, die Authentifizierungsdaten in Cookies speichert
Wildhammer
12

Nur eine kleine Änderung für den Code, der von @Roel Van de Paar geschrieben wurde, da ihm alle Ehre gemacht wird. Ich verwende dies in Windows und es funktioniert perfekt, sowohl zum Setzen als auch zum Hinzufügen von Cookies:

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.
quelle
2
Funktioniert perfekt! Vielen Dank für die Veröffentlichung des Codes für Windows! Du hast meinen Tag gerettet!
Anatol
Vielen Dank! So einfach, und es hat mich eine Weile verrückt gemacht. Up Stimmen für alle! :)
MT
0

Dies ist Code, den ich in Windows verwendet habe. Es funktioniert.

 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 du
quelle
-2

Mein Betriebssystem ist Windows 10 und die Chrome-Version ist 75.0.3770.100. Ich habe die 'User-Data-Dir'-Lösung ausprobiert, hat aber nicht funktioniert. versuchen die lösung von @ Eric Klien scheitert auch. Schließlich mache ich die Chrome-Einstellung wie auf dem Bild, es funktioniert! Aber es hat auf Windows Server 2012 nicht funktioniert.

Rahmen

Geben Sie hier die Bildbeschreibung ein

Battlesteed
quelle
3
Das PNG scheint in einer nicht so vertrauten Sprache zu sein wie Englisch. Bitte stellen Sie sicher, dass Sie nur auf Englisch posten.
Amonk