CodeGym /Cursos /Python SELF PT /Salvando e Cacheando Dados

Salvando e Cacheando Dados

Python SELF PT
Nível 34 , Lição 4
Disponível

1. Por que precisamos de cache?

Então, galera, chegamos a uma das partes mais bacanas do web scraping — cache de dados. Por que cache? Porque é como bater seu próprio "recorde de cinco minutos" rodando scripts! Bora entender por que isso é necessário e como funciona, mas de forma simples, sem complicação.

Imaginem: vocês fizeram web scraping de um site, pegaram todos os dados que precisavam e amanhã querem atualizar. Será que vão ter que refazer aquele loop infinito de requisições? Não! Dá pra evitar trabalho repetido e salvar os dados com cache.

Vantagens do cache:

  • Velocidade: Dados armazenados no cache estão disponíveis mais rápido do que recarregá-los do servidor. É como ter seu doce favorito prontinho na geladeira, sem precisar ir até a padaria!
  • Economia: Você evita sobrecarregar os servidores com requisições desnecessárias e ainda economiza sua internet. Bônus grátis!
  • Resiliência: Cache ajuda a lidar com problemas temporários de conexão. Se o site ficar fora do ar, você ainda tem os dados. É quase como ter um paraquedas reserva.

2. Fundamentos do cache

O que é cache?

Cache é um armazenamento temporário que permite reutilizar dados previamente extraídos. Em programação, o cache ajuda a evitar requisições repetidas para os mesmos dados. Imagine que o cache é sua biblioteca pessoal de informações mais usadas.

Tipos de cache:

  • Cache em memória: Rápido, mas apaga os dados quando o dispositivo é desligado. Funciona como a memória RAM.
  • Cache em arquivo: Os dados ficam armazenados no disco, são mais duráveis e persistentes.

3. Cache na prática com Python

Para armazenar dados em cache no Python, podemos usar a biblioteca requests. Porém, requests não suporta cache nativamente. É aí que entra a requests-cache, que facilita adicionar cache às suas requisições.

Instalando a biblioteca

Bash

pip install requests-cache

Configurando o cache

Bora configurar o cache no nosso script:

Python

import requests_cache

# Configurando cache no SQLite
requests_cache.install_cache('demo_cache', expire_after=180)

import requests

# Fazendo requisição
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')

# Verifica de onde veio a resposta
print(f'From cache: {response.from_cache}')

# Exibindo os dados
print(response.json())

Primeiro, configuramos o cache usando requests_cache.install_cache. Isso cria um banco SQLite para armazenar os dados cacheados. O parâmetro expire_after define o tempo (em segundos) para que os dados cacheados sejam apagados. Aqui configuramos o cache para durar 3 minutos.

Detalhes do cache

Quando você rodar o código novamente, repare no response.from_cache. Essa variável será True nas chamadas subsequentes dentro dos primeiros 3 minutos.

Apagando o cache

Apagar o cache é fácil: exclua o arquivo do banco de dados ou use o método requests_cache.clear() para limpar todos os registros do cache.

4. Recursos avançados de cache

Cache condicionado

Às vezes, você pode precisar de um cache mais controlado. Por exemplo, você não precisa cachear dados desatualizados ou requisições com parâmetros alterados.

Para esses casos, use requests-cache com parâmetros adicionais:

Python

requests_cache.install_cache('custom_cache',
             allowable_methods=['GET', 'POST'],
             allowable_codes=[200, 404],
             ignored_parameters=['timestamp'])

Aqui permitimos cache para os métodos GET e POST e apenas para respostas com códigos 200 e 404. Também ignoramos o parâmetro timestamp, para que requisições com timestamps diferentes não sejam consideradas diferentes.

Usando Redis

Se precisar de uma solução mais robusta, como suporte a cache distribuído, você pode usar redis. É uma solução de cache em memória muito popular no mundo de grandes volumes de dados.

Passos para usar:

  1. Instale Redis e a biblioteca Python:
    Bash
    
    brew install redis  # para usuários de macOS
    pip install redis
    
  2. Configure o Redis no seu projeto:
    Python
    
    import redis
    import requests
    
    r = redis.Redis(host='localhost', port=6379, db=0)
    
    def get_cached_response(url):
        if r.get(url):
            return r.get(url).decode('utf-8')
        else:
            response = requests.get(url)
            r.setex(url, 3600, response.text)  # cache por 1 hora
            return response.text
    
    print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
    

Esse exemplo usa Redis para armazenar respostas por 1 hora. Verificamos se os dados já estão no cache e só fazemos a requisição HTTP se não estiverem.

5. Tratamento de erros

Quando você trabalha com cache, às vezes o banco pode ser corrompido ou os dados cacheados não atualizam. Nesse caso, é uma boa prática usar logs e verificar os dados regularmente.

Exemplo de código com logs:

Python

import logging

logging.basicConfig(level=logging.INFO)

try:
    response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
    logging.info("Dados recuperados com sucesso do cache")
except Exception as e:
    logging.error("Erro ao recuperar os dados: %s", str(e))

Considerações finais

Cache não é só uma ferramenta para acelerar o trabalho. É um jeito de tornar seus apps mais confiáveis e resistentes a falhas temporárias de rede ou sobrecarga nos servidores. Usar ferramentas como requests-cache ou redis ajuda a gerenciar requisições de maneira eficiente e a salvar dados para uso futuro. Seja um guru do cache e não sobrecarregue seus scripts com requisições desnecessárias! Como diz aquele velho ditado de programador: "É melhor cachear de uma vez do que perguntar mil vezes."

1
Pesquisa/teste
Evitar restrições para parsing, nível 34, lição 4
Indisponível
Evitar restrições para parsing
Evitar restrições para parsing
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION