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.

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)

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.


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)

1
Esto debería estar en su documentación :(
Tjorriemorrie


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()

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)

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)

-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í


4
el png parece estar en un idioma no tan familiar como el inglés. Asegúrate de publicar solo en inglés.
amonk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.