1. ¿Por qué es necesario el caching?
Bueno chicos, hemos llegado a una de las partes más emocionantes del web scraping: ¡el caching de datos! ¿Por qué hacer caching? Porque es como establecer tu propio "récord limpio de cinco minutos" trabajando con scripts. Vamos a entender por qué lo necesitamos y cómo funciona, pero de manera simple, para que no se te revuelva la cabeza.
Imagina esto: has hecho un web scraping de un sitio, obtuviste todos los datos necesarios y mañana quieres actualizarlos. ¿De verdad tendrás que meterte otra vez en un interminable ciclo de solicitudes? No, puedes evitar el trabajo duplicado y guardar los datos usando caching.
Ventajas del caching:
- Velocidad: Los datos cacheados están disponibles más rápido que volver a descargarlos del servidor. Es como tener acceso rápido a tu pastel favorito: no necesitas ir nuevamente a la tienda, ¡ya está en tu nevera!
- Ahorro: No sobrecargas los servidores con solicitudes innecesarias y también ahorras tu tráfico de internet. ¡Un bonus gratis!
- Resiliencia: El caching ayuda a lidiar con problemas temporales de conexión. Si el sitio de repente no está disponible, igual tienes los datos. Es como tener un paracaídas extra.
2. Fundamentos del caching de datos
¿Qué es el cache?
Un cache es un almacenamiento temporal que te permite reutilizar datos obtenidos previamente. En programación, el caching ayuda a evitar solicitar los mismos datos repetidamente. Piensa en el cache como tu biblioteca personal de información frecuentemente usada.
Tipos de cache:
- Cache en memoria: Rápido, pero se borra cuando se apaga el dispositivo. Funciona como la memoria RAM.
- Cache de archivos: Los datos se almacenan en el disco, siendo más resistente y duradero.
3. Caching práctico con Python
Para hacer caching de datos en Python, podemos usar la librería
requests
. Sin embargo, esta librería no soporta caching
de manera nativa. Aquí es donde entra en juego
requests-cache
, que ofrece una manera sencilla de añadir
caching a tus solicitudes.
Instalación de la librería
pip install requests-cache
Configuración del caching
Vamos a configurar el caching en nuestro script:
import requests_cache
# Configuramos el cache en SQLite
requests_cache.install_cache('demo_cache', expire_after=180)
import requests
# Realizamos una solicitud
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
# Verificamos de dónde vino la respuesta
print(f'Del cache: {response.from_cache}')
# Mostramos los datos
print(response.json())
Primero, configuramos el cache llamando a
requests_cache.install_cache
. Esto creará una base
de datos SQLite para almacenar los datos cacheados. El parámetro
expire_after
indica el tiempo (en segundos) después del cual
los datos cacheados serán eliminados. Aquí configuramos el cache
para tres minutos.
Características del caching
Cuando vuelvas a ejecutar este código, presta atención a
response.from_cache
. Esta variable será igual a
True
para las llamadas subsiguientes dentro de los primeros
tres minutos.
Eliminación del cache
Eliminar el cache es fácil: borra el archivo de la base de datos o usa
el método requests_cache.clear()
para limpiar todas las
entradas de tu cache.
4. Capacidades avanzadas de caching
Caching condicional
A veces necesitas caching más controlado. Por ejemplo, puede que no necesites cachear datos si ya están desactualizados o si cambian parámetros de la solicitud.
Para tales casos, puedes usar
requests-cache
con parámetros adicionales:
requests_cache.install_cache('custom_cache',
allowable_methods=['GET', 'POST'],
allowable_codes=[200, 404],
ignored_parameters=['timestamp'])
Aquí permitimos caching para los métodos
GET
y POST
, y solo para respuestas
con códigos 200 y 404. También ignoramos el parámetro
timestamp
para que las solicitudes con diferentes
marcas temporales no sean consideradas diferentes.
Trabajo con Redis
Si necesitas una solución más potente, como soporte para caching
distribuido, puedes usar redis
. Es un sistema de caching
basado en memoria, popular en el mundo de big data.
Pasos a seguir:
-
Instala Redis y la librería de Python:
Bash
brew install redis # para usuarios de macOS pip install redis
-
Configura Redis en tu proyecto:
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) # cacheamos por 1 hora return response.text print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
Este ejemplo usa Redis para almacenar respuestas durante una hora. Verificamos si los datos están en el cache y solo en caso de que falten se realiza la solicitud HTTP.
5. Manejo de errores
Cuando trabajas con caching, a veces la base puede estar dañada o el cache no se actualiza. En tales casos, una buena práctica es llevar un registro (logs) y revisar los datos regularmente.
Ejemplo de código para llevar logs:
import logging
logging.basicConfig(level=logging.INFO)
try:
response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
logging.info("Datos extraídos exitosamente del cache")
except Exception as e:
logging.error("Error al extraer datos: %s", str(e))
Reflexiones finales
El caching no es solo una herramienta para acelerar el trabajo.
Es una forma de hacer tus aplicaciones más confiables y resistentes
a fallos temporales en la red o sobrecarga de los servidores. Usar herramientas
como requests-cache
o redis
permite gestionar eficientemente las solicitudes y guardar datos
para su uso posterior. ¡Sé un gurú del cache y no sobrecargues
tus scripts con solicitudes innecesarias! Y como dice ese viejo
dicho programador: "Es mejor cachear una vez que preguntar cien veces."
GO TO FULL VERSION