Scarnox · Blog

Monitoraggio dei prezzi con il web scraping: una guida pratica

Il monitoraggio dei prezzi significa controllare il prezzo di un prodotto su un insieme di siti, secondo una pianificazione, e registrare ciò che vedi per confrontarlo nel tempo. Lo usano rivenditori, marketplace e analisti. Lo scraping dei prezzi è anche uno dei modi più comuni in cui uno scraper incontra un captcha, quindi vale la pena progettarlo bene. Questa guida copre cosa monitorare, come leggere i numeri da pagine che non sono mai state pensate per essere lette in quel modo, come memorizzare le variazioni e farne oggetto di avvisi, e come restare nei limiti delle regole di un sito mentre lo fai.

Parti da una fonte che puoi usare

Prima di scrivere codice, verifica se il sito offre un modo ufficiale per ottenere i dati: un feed di prodotti, un'API o un programma per partner. Sono più affidabili dello scraping e riducono gran parte del rischio legale e tecnico. Lo scraping è la soluzione di ripiego per le pagine pubbliche dove non esiste una via ufficiale, e i termini e robots.txt continuano ad applicarsi. La panoramica legale copre le domande generali.

Architettura in cinque parti

Un monitor affidabile ha cinque componenti, e tenerli separati rende più facile il debug:

  1. Pianificatore. Decide quali pagine prodotto visitare e quando. Distribuisci le visite nell'arco della giornata invece di controllare tutto nello stesso minuto.
  2. Downloader. Scarica la pagina, con un ritmo prudente, nuovi tentativi e una cache.
  3. Parser. Estrae il prezzo, il contesto della valuta e lo stato di disponibilità.
  4. Archivio. Conserva ogni rilevazione con un timestamp, così hai uno storico.
  5. Sistema di avvisi. Confronta il nuovo valore con l'ultimo e ti avvisa quando supera una soglia che hai impostato.

Estrarre i prezzi da pagine disordinate

I prezzi compaiono in molte forme: con separatori delle migliaia, con virgole decimali, con un'etichetta prima del numero, o suddivisi tra più elementi. Mantieni il parser piccolo e testalo con esempi reali. Ecco una versione che presume il formato comune con virgole per le migliaia e un punto per i decimali. Normalizza gli altri formati prima di chiamarla:

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """Return the first number in the text as a Decimal, or None."""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

Usa Decimal, non float, per tutto ciò che confronti o sommi. Gli arrotondamenti in virgola mobile possono far sembrare diversi due prezzi uguali. Conserva il testo grezzo accanto al valore interpretato, così puoi correggere un bug del parser in seguito senza riscaricare ogni pagina.

Memorizzare lo storico e rilevare le variazioni

Un singolo prezzo è un'istantanea. Il valore di un monitor sta nello storico. Memorizza una riga per ogni rilevazione, con l'ID del prodotto, la fonte, il timestamp, il valore interpretato e il testo grezzo. Allora l'avviso diventa un semplice confronto con la riga precedente. Avvisa solo per variazioni significative, come un calo superiore a una percentuale impostata, oppure un prodotto esaurito, così non vieni sommerso dal rumore.

Gestire varianti e pacchetti

Una pagina prodotto spesso mostra più prezzi: uno per taglia o colore, un prezzo per il pacchetto, un prezzo per i soci, oppure un prezzo che compare solo dopo una selezione. Decidi prima di costruire cosa dovrebbe registrare il monitor. Un approccio comune è memorizzare l'identificatore della variante insieme al prezzo, così una variazione in una taglia non sembra una variazione dell'intero prodotto. Fai attenzione ai prezzi "a partire da" e ai prezzi originali barrati, perché un parser che prende il numero sbagliato genererà falsi allarmi. Memorizza il testo dell'etichetta accanto a ogni valore, così puoi verificare cosa è stato letto quando un avviso sembra sbagliato.

Pianifica con prudenza

Controlla ogni prodotto a un intervallo che corrisponda a quanto spesso il suo prezzo cambia davvero. Un prodotto che cambia ogni giorno non richiede un controllo ogni ora. Aggiungi un jitter a ogni visita, limita il numero di richieste per sito all'ora e memorizza in cache i risultati per l'intervallo scelto. Queste abitudini mantengono basso il tuo carico e coerenti i dati.

Quando la pagina ti blocca

Le pagine dei prezzi sono bersagli frequenti per l'accesso automatizzato, quindi potresti vedere un blocco, un limite di frequenza o un captcha. Rallenta quando vedi un 429 o un 503, e smetti di visitare un sito che continua a rifiutarti. Se compare un captcha su una pagina che sei autorizzato ad automatizzare, il tipo di captcha attivo su Scarnox è PopularCaptcha. La guida Python per PopularCaptcha mostra il flusso del token. Leggi scraping senza farsi bloccare prima di aggiungere altra complessità, perché di solito un ritmo prudente risolve più di qualsiasi strumento in più.

Alcune pagine mostrano i prezzi con JavaScript. Per quelle, segui l'approccio descritto in scraping di siti JavaScript.

Scraping responsabile

Passi successivi

Inizia con il credito di prova gratuito, senza carta: crea un account e prova il flusso PopularCaptcha su una pagina che sei autorizzato ad automatizzare. Per le tariffe attuali, consulta la pagina dei prezzi.