Come fare scraping dei prezzi di Google Shopping nel 2026

Guida pratica al Google Shopping price scraper nel 2026: pattern URL, selettori CSS, proxy residenziali con geo città e un esempio Python completo tramite ProxyHat.

How to Scrape Google Shopping Prices in 2026: A Practical Guide
In questo articolo

Se cerchi come fare scraping dei prezzi di Google Shopping nel 2026, la prima cosa da chiarire è il trade-off tra API e HTML. Il Content API for Shopping di Google serve solo i prodotti del merchant autenticato: non ti dà accesso ai prezzi dei concorrenti. Per monitoraggio competitivo, intelligence di prezzo e confronti multi-vendor devi quindi analizzare l'HTML della SERP tbm=shop o le pagine prodotto /shopping/product/. Questa guida mostra come farlo in modo affidabile, con selettori concreti, parametri di localizzazione e proxy residenziali.

Come fare scraping dei prezzi di Google Shopping nel 2026: il quadro tecnico

Google Shopping non è un endpoint REST aperto. È un livello di presentazione costruito sopra il database merchant di Google, con rendering dinamico, localizzazione aggressiva e un anti-bot stack che si è indurito notevolmente tra il 2023 e il 2025. Per un Google Shopping price scraper funzionante devi gestire tre variabili contemporaneamente: il pattern URL corretto, i selettori che sopravvivono ai frequenti A/B test di Google e un pool di IP che non venga classificato come bot.

Il problema esiste perché Google monetizza Shopping tramite annunci sponsorizzati e partnership merchant, quindi ha ogni incentivo a rendere difficile l'estrazione massiva. I segnali di blocco tipici sono: redirect a google.com/sorry/index, sfide reCAPTCHA Enterprise, HTTP 429 ripetuti e SERP che tornano vuote o con layout degradato. Prima di scrivere codice, vale la pena leggere la robots.txt di Google: /search è esplicitamente escluso per crawler generici, il che significa che qualsiasi scraper opera in zona grigia rispetto al ToS.

API ufficiale vs parsing HTML: perché non c'è scelta

Il Content API for Shopping copre inventario, prezzo, disponibilità e feed di un singolo account merchant. È ottima se sei il venditore, inutile se vuoi sapere quanto un competitor fa pagare un ASIN o un GTIN. Non esiste un'API pubblica per i prezzi Shopping cross-merchant. L'unica alternativa legittima sono i partner ufficiali del programma Shopping/SERP, che però costano tipicamente migliaia di euro al mese e impongono clausole d'uso.

Per la maggior parte dei pricing analyst il percorso realistico è quindi: richieste HTTP localizzate verso www.google.com/search?tbm=shop&q=..., parsing del HTML, normalizzazione prezzi in valuta unica, storage in un data warehouse. La sfida non è il parsing in sé — è mantenere un tasso di successo accettabile (idealmente >95%) sotto rate limit aggressivi.

ApproccioCoperturaCosto indicativoResistenza ai blocchi
Content API for ShoppingSolo propri prodottiGratuito entro quoteN/A (autenticato)
Parsing HTML SERP tbm=shopTutti i merchant visibiliProxy + infrastrutturaMedia-bassa senza proxy
Partner SERP/Shopping ufficialiSecondo contrattoElevato (migliaia €/mese)Alta

Stack anti-bot di Google: cosa incontrerai

Google impiega un sistema a più livelli che combina fingerprinting del browser, analisi comportamentale e limiti per IP. I componenti che impattano direttamente uno scraper di Shopping sono:

  • reCAPTCHA Enterprise: sfida invisibile che assegna un risk score; score alto → redirect a sorry/index o sfida visibile.
  • Sorry redirect: HTTP 200 con body che reindirizza a google.com/sorry/index?continue=.... È un soft-block: troppi richiesti dallo stesso IP in finestre brevi.
  • Rate limit per IP: non documentati ufficialmente, ma empiricamente 80–150 richieste per IP in 24h su /search tendono a innescare throttling. Su tbm=shop la soglia può essere ancora più bassa.
  • Layout degradato: a volte Google non blocca, ma serve una SERP senza risultati organici o con solo annunci, segnalando che il tuo IP è stato marcato.

Il punto chiave: il blocco raramente è istantaneo. C'è quasi sempre una fase di soft-block in cui i risultati si degradano. Un scraper robusto rileva questa fase e ruota IP prima del hard-block.

Pattern URL e selettori CSS che funzionano nel 2026

La URL base per Shopping è:

https://www.google.com/search?tbm=shop&q={QUERY}&gl={COUNTRY}&hl={LANG}&num=100

Parametri chiave:

  • tbm=shop: attiva il vertical Shopping.
  • gl: geolocalizzazione paese (es. us, de, it). Influenza seller mostrati e valuta.
  • hl: lingua interfaccia (es. en, de).
  • num: risultati per pagina (max 100, ma Google spesso ne serve di meno).

Selettori osservati nelle SERP Shopping (soggetti a variazione — testali sempre):

  • Container risultato prodotto: .sh-dgr__content, .sh-pr__product-results
  • Titolo prodotto: .sh-dgr__content h3 o [role="heading"] dentro il container
  • Prezzo: .a8Pemb (storico, ancora comune), talvolta .eYmn5d in varianti A/B
  • Merchant/seller: .sh-dgr__merchant, .b5yc4e
  • Rating: .sh-dgr__content [aria-label*="star"] o span[role="img"]

Per le pagine dettaglio prodotto, la URL è https://www.google.com/shopping/product/{PRODUCT_ID}. Qui trovi il pannello offerte seller (.sh-os__offer-sellers in molte varianti) con prezzo, spedizione e disponibilità per ogni merchant.

Esempio di blocco risultato (HTML semplificato)

<div class="sh-dgr__content">
  <h3>Sony WH-1000XM5 Wireless Headphones</h3>
  <span class="a8Pemb">$328.00</span>
  <span class="sh-dgr__merchant">Best Buy</span>
  <span role="img" aria-label="Rated 4.6 out of 5">4.6</span>
</div>

Perché i prezzi localizzati richiedono proxy residenziali con geo a livello città

Il prezzo mostrato su Google Shopping dipende fortemente da paese, lingua e talvolta regione. Un shopper statunitense vede prezzi in USD con seller come Amazon US, Best Buy, Walmart; un shopper tedesco vede EUR e seller come MediaMarkt, Otto, Amazon DE. Un datacenter IP negli Stati Uniti che richiede gl=de viene spesso comunque servito con risultati US o con un layout degradato, perché Google incrocia IP geolocation e parametro gl.

Per un Google Shopping product data pipeline seria servono IP residenziali nel paese target, idealmente con geo a livello città per cogliere differenze regionali (tasse, disponibilità locale, spedizione). Con ProxyHat questo si fa nel username:

# US shopper
http://user-country-US:pass@gate.proxyhat.com:8080

# German shopper, Berlino
http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080

# Italiano, Milano
http://user-country-IT-city-milan:pass@gate.proxyhat.com:8080

Combinando geo IP e parametri gl/hl coerenti ottieni la stessa vista di un utente reale in quel mercato. Questo è il cuore del successo: IP + parametri URL devono raccontare la stessa storia geografica.

Esempio Python completo: Google Shopping price scraper con ProxyHat

Ecco un esempio funzionante con requests che usa il gateway ProxyHat, localizza negli Stati Uniti e parsa un blocco risultato troncato. Adattalo al tuo stack (Scrapy, Playwright, httpx).

import requests
from bs4 import BeautifulSoup
import random
import time

PROXY = "http://user-country-US:pass@gate.proxyhat.com:8080"
PROXIES = {"http": PROXY, "https": PROXY}

HEADERS = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/126.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
}

def scrape_shopping(query, country="us", lang="en"):
    url = (
        "https://www.google.com/search"
        f"?tbm=shop&q={requests.utils.quote(query)}"
        f"&gl={country}&hl={lang}&num=60"
    )
    r = requests.get(url, proxies=PROXIES, headers=HEADERS, timeout=20)

    # Rileva soft-block
    if "sorry/index" in r.url or r.status_code == 429:
        raise RuntimeError(f"Soft-block rilevato: {r.url}")

    soup = BeautifulSoup(r.text, "html.parser")
    results = []
    for card in soup.select(".sh-dgr__content"):
        title_el = card.select_one("h3")
        price_el = card.select_one(".a8Pemb")
        seller_el = card.select_one(".sh-dgr__merchant")
        rating_el = card.select_one("[role='img']")
        results.append({
            "title": title_el.get_text(strip=True) if title_el else None,
            "price": price_el.get_text(strip=True) if price_el else None,
            "seller": seller_el.get_text(strip=True) if seller_el else None,
            "rating": rating_el.get("aria-label") if rating_el else None,
        })
    return results

if __name__ == "__main__":
    data = scrape_shopping("Sony WH-1000XM5", country="us", lang="en")
    for d in data[:5]:
        print(d)
    time.sleep(random.uniform(3, 7))

Output atteso (troncato):

{'title': 'Sony WH-1000XM5 Wireless Headphones', 'price': '$328.00', 'seller': 'Best Buy', 'rating': 'Rated 4.6 out of 5'}
{'title': 'Sony WH-1000XM5', 'price': '$329.99', 'seller': 'Amazon', 'rating': 'Rated 4.5 out of 5'}

Nota l'uso di random.uniform(3, 7) tra le richieste: jitter umanizza il pattern e riduce la probabilità di soft-block. Per volumi seri, ruota sessioni ProxyHat con user-session-{id} per distribuire il carico su più IP residenziali.

Paginazione, batching e rilevamento soft-block

La paginazione su Shopping non è standard. Non esiste un semplice start=10 come nella SERP web classica: spesso devi cliccare "Show more" o seguire link /shopping/product/ per offerte aggiuntive. Strategie pratiche:

  • Batch di query: raggruppa 50–200 keyword per run, ruota sessione ogni 20–30 richieste.
  • Delay randomizzato: 3–8 secondi tra richieste, 30–90 secondi tra batch.
  • Concorrenza bassa: 5–10 thread per pool IP residenziale. ProxyHat supporta sessioni sticky per mantenere coerenza.
  • Rilevamento soft-block: controlla "sorry/index" in r.url, HTTP 429, body con zero .sh-dgr__content, o presenza di id="captcha-form".
  • Backoff esponenziale: al primo soft-block, pausa 60–300 secondi e cambia sessione.

Esempio di rotazione sessione:

import uuid

def get_proxy(country="US", city=None):
    session_id = uuid.uuid4().hex[:12]
    user = f"user-country-{country}"
    if city:
        user += f"-city-{city}"
    user += f"-session-{session_id}"
    return f"http://{user}:pass@gate.proxyhat.com:8080"

Etica, ToS e conformità

Lo scraping di prezzi pubblici è una zona grigia. Considerazioni concrete:

  • Dati pubblici: prezzi visibili a qualsiasi utente senza login. Non accedere a contenuti dietro autenticazione o paywall.
  • robots.txt: /search è disallowed per bot generici. Tecnicamente possibile, ma in tensione con il ToS di Google.
  • CFAA: negli Stati Uniti, il Computer Fraud and Abuse Act è stato interpretato in modi che potrebbero riguardare accessi non autorizzati a larga scala, sebbene casi come hiQ Labs v. LinkedIn abbiano parzialmente limitato l'applicabilità.
  • GDPR: i prezzi prodotti non sono dati personali, ma se colleghi merchant a persone o raccogli recensioni con dati utente, entra in gioco il Regolamento UE 2016/679.
  • Quando usare partner ufficiali: per pipeline enterprise, audit o casi d'uso mission-critical, i partner SERP/Shopping ufficiali rimuovono rischio legale e operativo. Costano di più ma sono la scelta conforme.

Per approfondire setup e best practice, consulta la documentazione ProxyHat. Per i nostri casi d'uso di web scraping e SERP tracking troverai pattern simili applicabili a Shopping.

Key Takeaways

  • Il Content API for Shopping copre solo i tuoi prodotti; per prezzi competitor devi parsare HTML tbm=shop.
  • Combina IP residenziali con geo città + parametri gl/hl coerenti per ottenere prezzi localizzati reali.
  • Rileva soft-block (sorry/index, 429, SERP vuote) prima che diventino CAPTCHA hard.
  • Selettori chiave: .sh-dgr__content, .a8Pemb, .sh-dgr__merchant. Testali sempre prima di deploy.
  • Per volumi enterprise o conformità rigorosa, valuta partner Shopping ufficiali.

Pronto a costruire il tuo Google Shopping price scraper? Esplora le location ProxyHat e i piani tariffari per scegliere il pool residenziale adatto al tuo mercato target.

Domande frequenti

Come fare scraping dei prezzi di Google Shopping nel 2026?

Il Content API for Shopping copre solo i prodotti del merchant autenticato. Per prezzi competitivi devi richiedere la SERP tbm=shop con parametri gl/hl localizzati, usare proxy residenziali con geo a livello città per allineare IP e paese, e parsare i container .sh-dgr__content con selettori come .a8Pemb per il prezzo e .sh-dgr__merchant per il seller.

Perché serve un proxy residenziale per il Google Shopping price scraper?

Google incrocia la geolocalizzazione dell'IP con i parametri gl/hl. Un IP datacenter statunitense che richiede gl=de viene spesso servito con risultati US o degradati. I proxy residenziali nel paese target, con geo città quando serve, replicano la vista di un utente reale e riducono soft-block e CAPTCHA.

Quali selettori CSS usare per Google Shopping?

I selettori più stabili nel 2026 includono .sh-dgr__content e .sh-pr__product-results come container, .a8Pemb per il prezzo, .sh-dgr__merchant per il seller e [role=img] con aria-label per il rating. Vanno sempre testati perché Google esegue A/B test frequenti sul layout Shopping.

Come evitare i blocchi nello scraping di Google Shopping?

Rileva i soft-block controllando redirect a sorry/index, HTTP 429, SERP vuote o form captcha. Usa delay randomizzati di 3-8 secondi tra richieste, ruota sessioni ProxyHat ogni 20-30 richieste, mantieni concorrenza bassa (5-10 thread per pool) e applica backoff esponenziale al primo segnale di throttle.

Monitora prezzi e concorrenti senza essere bloccato

Proxy residenziali affidabili per i dati e-commerce. Registrati e inizia a raccogliere dati puliti.

Inizia ora
← Torna al Blog