1. Perché serve il caching?
Allora, ragazzi, siamo arrivati a una delle parti più affascinanti del web scraping: il caching dei dati. Perché usare il caching? Perché è come stabilire il tuo record personale di "velocità di cinque minuti" con gli script! Vediamo insieme perché serve e come funziona, ma in modo semplice, così non facciamo andare la testa in tilt.
Immaginate: avete fatto il web scraping di un sito, avete preso tutti i dati necessari e domani volete aggiornarli. Davvero dovrete rifare tutto da capo, immergendovi in un ciclo infinito di richieste? No, si può evitare lavoro inutile e salvare i dati utilizzando il caching.
Vantaggi del caching:
- Velocità: I dati in cache sono accessibili più velocemente rispetto a scaricarli di nuovo dal server. È come avere accesso rapido al tuo dolce preferito: non devi tornare in pasticceria, è già nel tuo frigo!
- Risparmio: Non sovraccarichi i server con richieste inutili e risparmi anche sul tuo traffico internet. Un bonus gratuito!
- Affidabilità: Il caching aiuta a gestire problemi temporanei di connessione. Se il sito diventa improvvisamente non disponibile, hai comunque i dati. È come avere un paracadute di riserva.
2. Fondamenti del caching dei dati
Cos'è una cache?
La cache è un archivio temporaneo che permette di riutilizzare dati già estratti. In programmazione, il caching aiuta a evitare di richiedere gli stessi dati più volte. Pensate alla cache come alla vostra biblioteca personale di informazioni usate spesso.
Tipi di cache:
- Cache in memoria: Veloce, ma si svuota quando si spegne il dispositivo. Funziona come la RAM.
- Cache su file: I dati vengono salvati su disco, più persistente e durevole.
3. Caching pratico con Python
Per fare caching dei dati in Python, possiamo usare la libreria requests
. Tuttavia, la libreria requests
non supporta nativamente il caching. Qui entra in gioco requests-cache
, che offre un modo semplice per aggiungere caching alle tue richieste.
Installazione della libreria
pip install requests-cache
Configurazione del caching
Configuriamo il caching nel nostro script:
import requests_cache
# Configuriamo una cache SQLite
requests_cache.install_cache('demo_cache', expire_after=180)
import requests
# Inviamo una richiesta
response = requests.get('https://jsonplaceholder.typicode.com/todos/1')
# Verifichiamo da dove arriva la risposta
print(f'Dalla cache: {response.from_cache}')
# Stampiamo i dati
print(response.json())
Prima di tutto, configuriamo una cache usando
requests_cache.install_cache
. Questo creerà un database SQLite per memorizzare i dati in cache. Il parametro
expire_after
indica il tempo (in secondi) dopo il quale i dati in cache verranno eliminati. Qui abbiamo impostato il caching per tre minuti.
Particolarità del caching
Quando esegui nuovamente questo codice, fai attenzione a
response.from_cache
. Questa variabile sarà uguale a True
per le chiamate successive durante i primi tre minuti.
Eliminazione della cache
Eliminare la cache è semplice: cancella il file del database o usa il metodo requests_cache.clear()
per rimuovere tutte le registrazioni dalla tua cache.
4. Funzionalità avanzate del caching
Caching condizionato
A volte potrebbe essere necessario un caching più controllato. Ad esempio, non hai bisogno di mettere in cache i dati se sono già obsoleti o se i parametri delle richieste cambiano.
In questi casi, puoi utilizzare
requests-cache
con parametri aggiuntivi:
requests_cache.install_cache('custom_cache',
allowable_methods=['GET', 'POST'],
allowable_codes=[200, 404],
ignored_parameters=['timestamp'])
Qui permettiamo il caching per i metodi
GET
e POST
e solo per risposte con
codici 200 e 404. Ignoriamo anche il parametro
timestamp
, in modo che le richieste con timestamp diversi non vengano considerate diverse.
Lavorare con Redis
Se hai bisogno di una soluzione più potente, ad esempio il supporto per il caching distribuito, puoi utilizzare
redis
. È un sistema di caching in memoria molto popolare nel mondo dei big data.
Passaggi:
-
Installa Redis e la libreria Python:
Bash
brew install redis # per utenti macOS pip install redis
-
Configura Redis nel tuo progetto:
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) # caching per 1 ora return response.text print(get_cached_response('https://jsonplaceholder.typicode.com/todos/1'))
Questo esempio utilizza Redis per salvare le risposte per un'ora. Controlliamo se i dati sono già nella cache e, solo in caso negativo, facciamo la richiesta HTTP.
5. Gestione degli errori
Quando lavori con il caching, a volte il database può danneggiarsi o la cache non si aggiorna. In questi casi, è una buona pratica tenere dei log e fare controlli regolari sui dati.
Esempio di codice per il logging:
import logging
logging.basicConfig(level=logging.INFO)
try:
response = get_cached_response('https://jsonplaceholder.typicode.com/todos/1')
logging.info("Dati estratti con successo dalla cache")
except Exception as e:
logging.error("Errore durante l'estrazione dei dati: %s", str(e))
Conclusioni
Il caching non è solo uno strumento per velocizzare il lavoro. È un modo per rendere le tue applicazioni più affidabili e resilienti a problemi temporanei di rete o sovraccarichi del server. Usare strumenti come
requests-cache
o redis
ti permette di gestire in modo efficace le richieste e salvare i dati per un uso successivo. Diventa un guru del caching e non sovraccaricare i tuoi script con richieste inutili! E come dice un vecchio proverbio del programmatore: "Meglio fare caching una volta, che chiedere cento".
GO TO FULL VERSION