Como salvar e carregar cookies usando Python + Selenium WebDriver


106

Como posso salvar todos os cookies no Selenium WebDriver do Python em um arquivo txt e carregá-los mais tarde? A documentação não diz muito sobre a função getCookies.

Respostas:


179

Você pode salvar os cookies atuais como um objeto Python usando pickle. Por exemplo:

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 depois para adicioná-los de volta:

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
Estou recebendo o erro "protocolo de pickle deve ser <= 2". Usando o código de pickle que você postou. O que isto significa? Está se referindo aos argumentos?
— Aaron Hiniker

Isso faria a mesma coisa? cookieFile = open ("cookies.pkl", "w") dump = pickle.dumps (driver.get_cookies ()) cookieFile.write (dump)
— Aaron Hiniker

1
Olá Aaron, modifiquei um pouco o exemplo - basicamente o sinalizador 'b' adicionado às seções de abertura do arquivo. Você pode tentar com isso?
— Ali-Akber Saifee

Mesmo erro, não estou familiarizado com pickles, então não tenho certeza do que seja. "raise ValueError (" protocolo de pickle deve ser <=% d "% HIGHEST_PROTOCOL"
— Aaron Hiniker

5
Eu tenho um problema com isso. Funciona bem, entretanto, quando tento drive.add_cookienovamente, recebo uma mensagem de erro dizendo que a chave de "expiração" não é válida. Estou usando o chromedriver no Mac OS
— Solal

55

Quando você precisa de cookies de sessão para sessão, há outra maneira de fazer isso, use as opções do Chrome user-data-dir para usar pastas como perfis, eu executo:

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

Você pode fazer aqui os logins que verificam a interação humana, eu faço isso e depois os cookies de que preciso agora, toda vez que inicio o Webdriver com essa pasta, tudo está lá. Você também pode instalar manualmente as extensões e tê-las em todas as sessões. Na segunda vez que corro, todos os cookies estão lá:

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. 

A vantagem é que você pode usar várias pastas com diferentes configurações e cookies, Extensões sem a necessidade de carregar, descarregar cookies, instalar e desinstalar extensões, alterar configurações, alterar logins via código e, portanto, não há como interromper a lógica do programa, etc Além disso, isso é mais rápido do que ter que fazer tudo por código.


4
Esta foi a melhor solução para mim ao lidar com logins do Google. Em algum ponto, meu uso de desenvolvimento foi sinalizado como atividade suspeita.
— Moshe Stauber

2
@ p1g1n foi sinalizado antes ou depois de usar esta solução
— Eduard Florinescu

3
Desculpe, foi sinalizado antes de usar a solução. Agora fico logado para que não haja atividades suspeitas.
— Moshe Stauber

2
chrome_options = Options()me dá name 'Options' is not defined...?
— Dan,

4
@Dan você precisa:from selenium.webdriver.chrome.options import Options
— Eduard Florinescu

32

Lembre-se de que você só pode adicionar um cookie para o domínio atual. Se você quiser adicionar um cookie à sua conta do Google, faça

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

1
Isso deve estar em sua documentação :(
— Tjorriemorrie


3
@MauricioCortazar não diz nada sobre o requisito de domínio, que é a que eu estava me referindo
— Tjorriemorrie

2
@Tjorriemorrie isso é básico cara, os cookies só são armazenados no domínio, mesmo subdomínio não são permitidos
— Mauricio Cortazar

1
Este comentário parece relevante quando se trata de vários domínios usando um cookie de um domínio raiz. Por exemplo, google.com pode ser o domínio raiz e outro domínio ou subdomínio pertencente ao Google pode usar o mesmo cookie. Eu gosto mais da solução do @Eduard Florinescu por isso (e outros motivos), já que não requer o uso do navegador. Antes de carregar os cookies, eles já estão lá no diretório de dados. Parece que o browser.get adicional é necessário aqui antes de carregar o arquivo de cookies (de acordo com este comentário), embora não o testei.
— Roel Van de Paar

12

Com base na resposta de @Eduard Florinescu, mas com código mais recente e importação ausente adicionada:

$ 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
O negócio de picles não funcionou para mim. (Esta é a segunda vez que tento usá-lo.) Então, usei seu método, que também não funcionou para mim no início. Alterações que tive de fazer: tive que digitar chrome_options.add_argument ('no-sandbox') devido ao problema documentado em github.com/theintern/intern/issues/878 e tive que fazer user-data-dir um caminho completo no meu ambiente Windows 10.
— Eric Klien

Não está funcionando para meu site que armazena dados de autenticação em cookies
— Wildhammer

12

Apenas uma pequena modificação no código escrito por @Roel Van de Paar, já que todo o crédito vai para ele. Estou usando no Windows e está funcionando perfeitamente, tanto para definir quanto para adicionar 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 perfeitamente! Obrigado por postar o código do Windows! Você salvou meu dia!
— Anatol

Obrigado! Tão simples, e isso está me deixando louco por um tempo. Votos positivos para todos! :)
— MT

0

este é o código que usei no 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

meu sistema operacional é o Windows 10 e a versão do Chrome é 75.0.3770.100. Eu tentei a solução 'user-data-dir', não funcionou. tentar a solução de @Eric Klien também falha. finalmente, faço a configuração do cromo como na imagem, funciona! mas não funcionou no Windows Server 2012.

configuração

insira a descrição da imagem aqui


4
o png parece estar em um idioma não tão familiar quanto o inglês. Certifique-se de postar apenas em inglês, por favor.
— amonk
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.