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.