Come salvare e caricare i cookie utilizzando Python + Selenium WebDriver


108

Come posso salvare tutti i cookie nel Selenium WebDriver di Python in un file txt, quindi caricarli in un secondo momento? La documentazione non dice molto sulla funzione getCookies.

Risposte:


181

Puoi salvare i cookie correnti come oggetto Python usando pickle. Per esempio:

import pickle
import selenium.webdriver 

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

e successivamente per aggiungerli di nuovo:

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
Ricevo l'errore "il protocollo pickle deve essere <= 2". Usando il codice pickle che hai pubblicato. Cosa significa questo? Si riferisce agli argomenti?
Aaron Hiniker

Questo farebbe la stessa cosa? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker

1
Ciao Aaron, ho modificato un po 'l'esempio, in pratica il flag "b" aggiunto alle sezioni di apertura del file. Puoi provare con quello?
Ali-Akber Saifee

Stesso errore, non ho familiarità con il sottaceto, quindi non sono sicuro di cosa sia. "raise ValueError (" pickle protocol must be <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker

5
Ho un problema con questo. Funziona bene, tuttavia quando provo di drive.add_cookienuovo ho ricevuto un messaggio di errore che dice che la chiave "scadenza" non è valida. Sto usando Chromedriver su Mac OS
Solal

56

Quando hai bisogno di cookie di sessione in sessione c'è un altro modo per farlo, usa le opzioni di Chrome user-data-dir per poter usare le cartelle come profili, eseguo:

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

Puoi fare qui gli accessi che controllano l'interazione umana, io faccio questo e poi i cookie di cui ho bisogno ora ogni volta che avvio il Webdriver con quella cartella tutto è lì. Puoi anche installare manualmente le estensioni e averle in ogni sessione. La seconda volta che corro, tutti i cookie ci sono:

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. 

Il vantaggio è che puoi utilizzare più cartelle con impostazioni e cookie diversi, estensioni senza la necessità di caricare, scaricare cookie, installare e disinstallare estensioni, modificare le impostazioni, modificare gli accessi tramite codice e quindi non è possibile interrompere la logica del programma, ecc Inoltre questo è più veloce di dover fare tutto tramite codice.


4
Questa è stata la soluzione migliore per me quando ho a che fare con gli accessi a Google. Ad un certo punto il mio utilizzo dello sviluppo è stato contrassegnato come attività sospetta.
Moshe Stauber

2
@ p1g1n è stato contrassegnato prima o dopo aver utilizzato questa soluzione
Eduard Florinescu

3
Spiacenti, è stato segnalato prima di utilizzare la soluzione. Ora rimango connesso in modo che non ci siano attività sospette.
Moshe Stauber

2
chrome_options = Options()mi dà name 'Options' is not defined...?
Dan

4
@ Dan hai bisogno di:from selenium.webdriver.chrome.options import Options
Eduard Florinescu

32

Ricorda, puoi aggiungere un cookie solo per il dominio corrente. Se vuoi aggiungere un cookie per il tuo account Google, fallo

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

1
Questo dovrebbe essere nella loro documentazione :(
Tjorriemorrie


3
@MauricioCortazar non dice nulla sui requisiti del dominio, che è ciò a cui mi riferivo
Tjorriemorrie

2
@Tjorriemorrie è un uomo di base, solo i cookie sono memorizzati nel dominio, anche il sottodominio non è consentito
Mauricio Cortazar

1
Questo commento sembra pertinente quando si tratta di più domini che utilizzano un cookie da un dominio principale. Ad esempio, google.com potrebbe essere il dominio principale e un altro dominio o sottodominio di proprietà di Google potrebbe utilizzare lo stesso cookie. Mi piace di più la soluzione di @Eduard Florinescu per questo (e per altri motivi) in quanto non richiede l'utilizzo del browser.get prima di caricare i cookie, sono già presenti dalla directory dei dati. Sembra che qui sia richiesto il browser.get aggiuntivo prima di caricare il file dei cookie (come da questo commento), anche se non l'ho testato.
Roel Van de Paar

12

Basato sulla risposta di @Eduard Florinescu ma con codice più recente e importazione mancante aggiunta:

$ 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
La roba sottaceto non ha funzionato per me. (Questa è la seconda volta che provo a usarlo.) Quindi ho usato il tuo metodo che all'inizio non ha funzionato per me. Modifiche che ho dovuto apportare: ho dovuto digitare chrome_options.add_argument ('no-sandbox') a causa del problema documentato su github.com/theintern/intern/issues/878 e ho dovuto rendere user-data-dir un percorso completo nel mio ambiente Windows 10.
Eric Klien

Non funziona per il mio sito web che memorizza i dati di autenticazione nei cookie
Wildhammer

12

Solo una leggera modifica al codice scritto da @Roel Van de Paar, dato che tutto il merito va a lui. Lo sto usando in Windows e funziona perfettamente, sia per l'impostazione che per l'aggiunta di 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
Funziona perfettamente! Grazie per aver pubblicato il codice per Windows! Mi hai salvato la giornata!
Anatol

Grazie! Così semplice, e mi ha fatto impazzire per un po '. Up voti per tutti! :)
MT

0

questo è il codice che ho usato in Windows, funziona.

 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

il mio sistema operativo è Windows 10 e la versione di Chrome è 75.0.3770.100. Ho provato la soluzione 'user-data-dir', non ha funzionato. prova anche la soluzione di @ Eric Klien. infine, ho impostato le impostazioni di Chrome come nell'immagine, funziona! ma non ha funzionato su Windows Server 2012.

ambientazione

inserisci qui la descrizione dell'immagine


4
il png sembra essere in una lingua non così familiare come l'inglese. Assicurati di pubblicare solo in inglese per favore.
amonk
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.