O protocolo HTTP é baseado em sem estado, o que significa que após uma solicitação e resposta entre o navegador e o servidor, a conexão é encerrada, sem reter informações do usuário. Isso leva à necessidade de mceanismos como cookies e sessões para manter o estado, permitindo funcionalidades como login automático e rastreamento de preferências do usuário para recomendações personalizadas. Os cookies possuem um tempo de validade e podem ser renovados após expirarem.
Uso de Cookies com a Biblioteca requests
Para obter cookies de uma resposta, pode-se extrair o atributo cookies do objeto de resposta. Por exemplo:
resposta = requests.post(url, cabecalhos=cabecalhos, dados=dados)
cookies_obtidos = resposta.cookies
Para usar os cookies em uma nova solicitação, passe-os como parâmetro:
resposta = requests.post(url, cabecalhos=cabecalhos, dados=dados, cookies=cookies_obtidos)
Note que dados deve ser um dicionário com os pares chave-valor necessários.
Trabalhando com Sessões e o Papel dos Cookies
Uma sessão pode ser criada com requests.session(), que mantém automaticamente os cookies entre as solicitações. Inicialmente, os cookies da sessão estão vazios:
sessao = requests.session()
print(type(sessao.cookies)) # Saída: <class 'requests.cookies.RequestsCookieJar'>
print(sessao.cookies) # Saída: <RequestsCookieJar[]>
Ao realizar uma solicitação de login usando a sessão, o servidor responde com cookies de autenticação, que são armazenados automaticamente:
login_resposta = sessao.post(url_login, dados=dados_login, cabecalhos=cabecalhos)
print(sessao.cookies) # Exibe os cookies recebidos, incluindo tokens de sessão
Subsequentemente, ao fazer uma solicitação de comentário, os cookies armazenados são reutilizados, eliminando a necessidade de fornecer credenciais novamente:
comentario_resposta = sessao.post(url_comentario, dados=dados_comentario, cabecalhos=cabecalhos)
print(sessao.cookies) # Os cookies permanecem os mesmos ou podem ser atualizados
Salvando e Recuperando Cookies
Os cookies podem ser convertidos de um RequestsCookieJar para um dicionário e, em seguida, serializados como uma string JSON para armazenamento em arquivo:
import json
sessao = requests.session()
sessao.post(url_login, dados=dados_login, cabecalhos=cabecalhos)
cookies_dict = requests.utils.dict_from_cookiejar(sessao.cookies)
cookies_str = json.dumps(cookies_dict)
with open('cookies.json', 'w', encoding='utf-8') as arquivo:
arquivo.write(cookies_str)
Para recuperar os cookies de um arquivo, inverta o processo: leia a string JSON, converta-a em um dicionário e, em seguida, em um RequestsCookieJar para atribuir à sessão:
with open('cookies.json', 'r', encoding='utf-8') as arquivo:
cookies_str_lido = arquivo.read()
cookies_dict_lido = json.loads(cookies_str_lido)
cookies_lidos = requests.utils.cookiejar_from_dict(cookies_dict_lido)
sessao.cookies = cookies_lidos
comentario_resposta = sessao.post(url_comentario, dados=dados_comentario, cabecalhos=cabecalhos)
print(comentario_resposta)
Exemplo Completo com Modularização
O código a seguir demonstra uma estrutura modular para login, armazenamento de cookies e publicação de comentários, com tratamento de erros:
import requests
import json
sessao = requests.session()
cabecalhos = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
def carregar_cookies():
try:
with open('cookies.json', 'r', encoding='utf-8') as f:
dados = json.load(f)
return requests.utils.cookiejar_from_dict(dados)
except FileNotFoundError:
return None
def realizar_login(usuario, senha):
url_login = 'https://exemplo.com/login'
dados_login = {'username': usuario, 'password': senha}
sessao.post(url_login, headers=cabecalhos, data=dados_login)
cookies_dict = requests.utils.dict_from_cookiejar(sessao.cookies)
with open('cookies.json', 'w', encoding='utf-8') as f:
json.dump(cookies_dict, f)
def publicar_comentario(texto):
url_comentario = 'https://exemplo.com/comentar'
dados_comentario = {'comment': texto, 'post_id': '1'}
return sessao.post(url_comentario, headers=cabecalhos, data=dados_comentario)
# Uso principal
cookies = carregar_cookies()
if cookies:
sessao.cookies = cookies
else:
realizar_login('usuario', 'senha')
sessao.cookies = carregar_cookies()
resposta = publicar_comentario('Comentário de teste!')
if resposta.status_code == 200:
print('Comentário publicado com sucesso!')
else:
realizar_login('usuario', 'senha')
sessao.cookies = carregar_cookies()
resposta = publicar_comentario('Comentário de teste!')
print(resposta)