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.

Aaron Hiniker
fonte

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)
Ali-Akber Saifee
fonte
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.

Eduard Florinescu
fonte
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)
Exsonic
fonte
1
Isso deve estar em sua documentação :(
Tjorriemorrie
1
@Tjorriemorrie selenium-python.readthedocs.io/…
Mauricio Cortazar
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()
Roel Van de Paar
fonte
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)
Jagadeeswara Reddy P
fonte
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)
yong você
fonte
-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

velocidade de batalha
fonte
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