Cómo guardar y cargar cookies usando Python + Selenium WebDriver

108

¿Cómo puedo guardar todas las cookies en Selenium WebDriver de Python en un archivo txt y luego cargarlas más tarde? La documentación no dice mucho sobre la función getCookies.

Aaron Hiniker
fuente

Respuestas:

181

Puede guardar las cookies actuales como un objeto de Python usando pickle. Por ejemplo:

import pickle
import selenium.webdriver 

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

y luego para volver a agregarlos:

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
fuente
1
Recibo el error "El protocolo pickle debe ser <= 2". Usando el código de pickle que publicaste. ¿Qué significa esto? ¿Se refiere a los argumentos?
Aaron Hiniker
¿Haría esto lo mismo? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
Aaron Hiniker
1
Hola Aaron, modifiqué un poco la muestra, básicamente la bandera 'b' agregada a las secciones abiertas del archivo. ¿Puedes probar con eso?
Ali-Akber Saifee
Mismo error, no estoy familiarizado con pickle, así que no estoy seguro de qué es. "raise ValueError (" el protocolo pickle debe ser <=% d "% HIGHEST_PROTOCOL"
Aaron Hiniker
5
Tengo un problema con esto. Funciona bien, sin embargo, cuando lo intento de drive.add_cookienuevo, aparece un mensaje de error que dice que la clave de "caducidad" no es válida. Estoy usando chromedriver en Mac OS
Solal
56

Cuando necesite cookies de una sesión a otra, hay otra forma de hacerlo, use las opciones de Chrome user-data-dir para usar carpetas como perfiles, ejecuto:

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

Puede hacer aquí los inicios de sesión que verifican la interacción humana, yo hago esto y luego las cookies que necesito ahora cada vez que inicio el Webdriver con esa carpeta, todo está allí. También puede instalar manualmente las Extensiones y tenerlas en cada sesión. Segundo tiempo que corro, todas las cookies están ahí:

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. 

La ventaja es que puede usar múltiples carpetas con diferentes configuraciones y cookies, extensiones sin la necesidad de cargar, descargar cookies, instalar y desinstalar extensiones, cambiar configuraciones, cambiar inicios de sesión a través del código y, por lo tanto, no hay forma de que se rompa la lógica del programa. etc También esto es más rápido que tener que hacerlo todo por código.

Eduard Florinescu
fuente
4
Esta fue la mejor solución para mí al tratar con los inicios de sesión de Google. En algún momento, mi uso de desarrollo se marcó como actividad sospechosa.
Moshe Stauber
2
@ p1g1n fue marcado antes o después de usar esta solución
Eduard Florinescu
3
Lo sentimos, se marcó antes de usar la solución. Ahora permanezco conectado para que no haya actividad sospechosa.
Moshe Stauber
2
chrome_options = Options()me da name 'Options' is not defined...?
Dan
4
@Dan necesitas:from selenium.webdriver.chrome.options import Options
Eduard Florinescu
32

Recuerde, solo puede agregar una cookie para el dominio actual. Si desea agregar una cookie a su cuenta de Google, haga

browser.get('http://google.com')
for cookie in cookies:
    browser.add_cookie(cookie)
Exsonic
fuente
1
Esto debería estar en su documentación :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/…
Mauricio Cortazar
3
@MauricioCortazar no dice nada sobre el requisito de dominio, que es a lo que me refería
Tjorriemorrie
2
@Tjorriemorrie eso es hombre básico, las cookies solo se almacenan en el dominio, incluso los subdominios no están permitidos
Mauricio Cortazar
1
Este comentario parece relevante cuando se trata de varios dominios que utilizan una cookie de un dominio raíz. Por ejemplo, google.com podría ser el dominio raíz y otro dominio o subdominio propiedad de Google podría usar la misma cookie. Me gusta más la solución de @Eduard Florinescu por esta (y otras razones) ya que no requiere usar el browser.get antes de cargar las cookies, ya están allí desde el directorio de datos. Parece que se requiere el browser.get adicional aquí antes de cargar el archivo de cookies (según este comentario), aunque no lo probé.
Roel Van de Paar
12

Basado en la respuesta de @Eduard Florinescu pero con un código más nuevo y una importación faltante agregada:

$ 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
fuente
3
El pepinillo no funcionó para mí. (Esta es la segunda vez que lo intento). Así que usé su método, que tampoco me funcionó al principio. Cambios que tuve que hacer: tuve que escribir chrome_options.add_argument ('no-sandbox') debido al problema documentado en github.com/theintern/intern/issues/878 y tuve que hacer de user-data-dir una ruta completa en mi entorno Windows 10.
Eric Klien
No funciona para mi sitio web que almacena datos de autenticación en cookies
Wildhammer
12

Solo una pequeña modificación para el código escrito por @Roel Van de Paar, ya que todo el crédito es para él. Estoy usando esto en Windows y está funcionando perfectamente, tanto para configurar como para agregar 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
fuente
2
¡Funciona perfectamente! ¡Gracias por publicar el código para Windows! ¡Salvaste mi día!
Anatol
¡Gracias! Tan simple, y me ha estado volviendo loco por un tiempo. ¡Votos más para todos! :)
MT
0

este es el código que usé en Windows, funciona.

 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 tu
fuente
-2

mi sistema operativo es Windows 10 y la versión de Chrome es 75.0.3770.100. Probé la solución 'user-data-dir', no funcionó. Prueba la solución de @ Eric Klien también falla. finalmente, hago la configuración de Chrome como la imagen, ¡funciona! pero no funcionó en Windows Server 2012.

ajuste

ingrese la descripción de la imagen aquí

battlesteed
fuente
4
el png parece estar en un idioma no tan familiar como el inglés. Asegúrate de publicar solo en inglés.
amonk