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
pip install requests-cache
Configurando o cache
Bora configurar o cache no nosso script:
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:
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:
- Instale Redis e a biblioteca Python:
Bash
brew install redis # para usuários de macOS pip install redis - 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:
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."
GO TO FULL VERSION