Comment scraper les prix Google Shopping en 2026 : le compromis API vs HTML
Si vous êtes analyste de prix ou ingénieur en intelligence concurrentielle, vous savez que scraper Google Shopping est l'un des moyens les plus rapides de comparer les prix across multiples marchands pour un même produit. Mais contrairement à ce que beaucoup pensent, il n'existe pas d'API publique Google qui vous donne les prix des concurrents. Le Content API for Shopping de Google ne sert que les produits de votre propre compte marchand — pas ceux de vos concurrents.
Pour obtenir des données concurrentielles, il faut donc parser le HTML des pages de résultats Google Shopping (tbm=shop) ou les fiches produits détaillées (/shopping/product/). C'est là que les choses se compliquent : Google protège ses SERPs avec l'un des systèmes anti-bot les plus agressifs du web, et les prix affichés varient selon la géolocalisation de la requête. Ce guide vous montre comment comment scraper les prix Google Shopping en 2026 de façon fiable, avec des proxies résidentiels, des sélecteurs concrets, et du code Python prêt à l'emploi.
Le contexte technique : pourquoi scraper Google Shopping est difficile
Google Shopping n'est pas une page statique simple. C'est une SERP dynamique qui combine résultats organiques, annonces sponsorisées, fiches produits enrichies, et panneaux d'offres marchands. Le HTML rendu dépend du pays, de la langue, du device, et même de l'historique de navigation. Pire encore, Google applique plusieurs couches de protection :
- reCAPTCHA Enterprise — déclenché après un certain volume de requêtes suspectes depuis une même IP.
- Redirect
sorry/index— Google renvoie une page d'erreur 429 ou 503 avec un message « Our systems have detected unusual traffic from your computer network ». - Rate limits per-IP agressifs — généralement 50 à 100 requêtes par minute avant le premier soft-block, selon la signature du navigateur.
- JavaScript rendering conditionnel — certains panneaux d'offres marchands ne se chargent qu'après exécution de JS, ce qui complique le parsing HTML simple.
Selon une analyse des risques juridiques liés au CFAA, scraper des données publiquement accessibles reste juridiquement incertain aux États-Unis, surtout si cela enfreint les conditions d'utilisation de la plateforme. En Europe, le RGPD s'applique uniquement aux données personnelles — les prix produits ne sont pas concernés, mais les logs de navigation le sont potentiellement.
Patterns d'URL et sélecteurs CSS pour Google Shopping
La page de résultats Google Shopping s'obtient via l'URL suivante :
https://www.google.com/search?tbm=shop&q=iphone+15+pro&gl=us&hl=en
Les paramètres clés :
tbm=shop— active l'onglet Shopping.q=— la requête produit.gl=us— pays de la recherche (US, DE, FR, GB, JP…).hl=en— langue de l'interface (en, de, fr, ja…).
Sélecteurs CSS principaux
Voici les conteneurs et nœuds les plus stables en 2025-2026 pour extraire les données produits Google Shopping :
| Élément | Sélecteur CSS | Description |
|---|---|---|
| Conteneur de résultat | .sh-dgr__content | Bloc principal d'un produit dans la SERP |
| Grille de résultats | .sh-pr__product-results | Conteneur parent de tous les produits |
| Titre produit | .sh-dgr__content h3 ou [role="heading"] | Nom du produit |
| Prix | .a8Pemb | Nœud de prix formaté (ex. « $999.00 ») |
| Vendeur | .a8Pemb-OzVIJc ou .sh-dgr__content [class*="merchant"] | Nom du marchand |
| Note / Étoiles | .sh-dgr__content [role="img"] | Note sur 5 avec aria-label |
Pour la page de détail d'un produit :
https://www.google.com/shopping/product/1234567890/reviews
Les panneaux d'offres marchands (seller-offer panels) apparaissent dans des conteneurs .sh-pr__offer ou [data-merchant-id], avec le prix dans .a8Pemb et le nom du vendeur dans un span adjacent.
Astuce : les classes CSS de Google changent fréquemment. Utilisez des sélecteurs partielles (
[class*="sh-dgr"]) plutôt que des classes exactes pour améliorer la résilience.
Pourquoi les prix localisés exigent des proxies résidentiels avec géo au niveau ville
Un acheteur américain qui cherche « iPhone 15 Pro » sur Google Shopping verra des vendeurs comme Best Buy, Amazon US, et B&H Photo, avec des prix en USD. Un acheteur allemand cherchant le même produit verra MediaMarkt, Saturn, et Amazon.de, avec des prix en EUR. La différence ne vient pas seulement des paramètres gl et hl — elle vient aussi de l'adresse IP du visiteur.
Google utilise l'IP pour déterminer la localisation et ajuster les résultats Shopping. Si vous scrapez depuis un datacenter en France avec gl=us, vous obtiendrez des résultats hybrides ou incorrects. Pour un scraper prix Google Shopping fiable, vous avez besoin de :
- Proxies résidentiels — adresses IP de vrais FAI, indiscernables du trafic organique.
- Géo au niveau pays —
user-country-USpour les prix US,user-country-DEpour l'Allemagne. - Géo au niveau ville —
user-country-DE-city-berlinpour des résultats encore plus précis, utiles quand les prix varient entre Berlin et Munich. - Rotation par requête — chaque requête utilise une IP différente pour rester sous les seuils de rate limit.
Comparaison des types de proxies pour Google Shopping
| Type de proxy | Détection anti-bot | Géo précision | Latence moyenne | Coût relatif |
|---|---|---|---|---|
| Datacenter | Élevée (IPs facilement blacklistées) | Pays uniquement | 50ms | $ |
| Résidentiel | Faible (IPs de FAI réels) | Pays + ville | 200ms | $$ |
| Mobile | Très faible (IPs opérateurs 4G/5G) | Pays + ville | 400ms | $$$ |
Pour Google Shopping, les proxies résidentiels offrent le meilleur rapport qualité-prix : assez rapides pour du scraping à grande échelle, assez discrets pour éviter les CAPTCHAs, et avec une précision géo suffisante pour la plupart des cas d'usage. Consultez notre page des locations pour voir les pays et villes disponibles.
Exemple Python : scraper Google Shopping avec ProxyHat
Voici un exemple complet en Python utilisant requests et la documentation ProxyHat pour scraper un résultat Google Shopping via le gateway gate.proxyhat.com:8080.
import requests
from bs4 import BeautifulSoup
import random
import time
# Configuration ProxyHat — proxy résidentiel US
PROXY = {
"http": "http://user-country-US:pass@gate.proxyhat.com:8080",
"https": "http://user-country-US:pass@gate.proxyhat.com:8080",
}
HEADERS = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36"
),
"Accept-Language": "en-US,en;q=0.9",
}
def scrape_google_shopping(query, gl="us", hl="en"):
url = f"https://www.google.com/search?tbm=shop&q={query}&gl={gl}&hl={hl}"
try:
resp = requests.get(url, headers=HEADERS, proxies=PROXY, timeout=15)
resp.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Erreur de requête: {e}")
return []
# Détecter soft-block
if "sorry/index" in resp.url or "unusual traffic" in resp.text.lower():
print("Soft-block détecté — changer d'IP et réessayer")
return []
soup = BeautifulSoup(resp.text, "html.parser")
results = []
# Parser les conteneurs de produits
products = soup.select(".sh-dgr__content")
for product in products[:10]: # truncation — 10 premiers résultats
title_node = product.select_one("h3, [role='heading']")
price_node = product.select_one(".a8Pemb")
title = title_node.get_text(strip=True) if title_node else "N/A"
price = price_node.get_text(strip=True) if price_node else "N/A"
# Extraire vendeur et note (sélecteurs variables)
seller_node = product.select_one("[class*='merchant']")
seller = seller_node.get_text(strip=True) if seller_node else "N/A"
rating_node = product.select_one("[role='img']")
rating = rating_node.get("aria-label", "N/A") if rating_node else "N/A"
results.append({
"title": title,
"price": price,
"seller": seller,
"rating": rating,
})
return results
# Exemple d'utilisation
if __name__ == "__main__":
results = scrape_google_shopping("iphone+15+pro", gl="us", hl="en")
for r in results[:3]:
print(f"{r['title']} | {r['price']} | {r['seller']} | {r['rating']}")
# Exemple de sortie (tronqué) :
# Apple iPhone 15 Pro 128GB | $999.00 | bestbuy.com | 4.5 stars
Pour scraper en Allemagne avec des prix en EUR et des vendeurs locaux, changez simplement le proxy et les paramètres :
# Proxy résidentiel à Berlin, Allemagne
PROXY_DE = {
"http": "http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080",
"https": "http://user-country-DE-city-berlin:pass@gate.proxyhat.com:8080",
}
HEADERS_DE = {
"User-Agent": (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.0.0.0 Safari/537.36"
),
"Accept-Language": "de-DE,de;q=0.9",
}
results_de = scrape_google_shopping("iphone+15+pro", gl="de", hl="de")
# Apple iPhone 15 Pro 128GB | 1.149,00 € | mediamarkt.de | 4,5 Sterne
Exemple avec session sticky SOCKS5
Si vous devez maintenir la même IP pour plusieurs requêtes (pagination, comparaison de produits), utilisez une session sticky via SOCKS5 :
import requests
PROXY_SOCKS5 = {
"http": "socks5://user-session-abc123-country-US:pass@gate.proxyhat.com:1080",
"https": "socks5://user-session-abc123-country-US:pass@gate.proxyhat.com:1080",
}
# Toutes les requêtes avec ce proxy partageront la même IP
resp = requests.get(
"https://www.google.com/search?tbm=shop&q=ps5&gl=us&hl=en",
headers=HEADERS,
proxies=PROXY_SOCKS5,
timeout=20,
)
Pagination, batching, délais randomisés et détection de soft-blocks
Un scraper prix Google Shopping à l'échelle ne se contente pas d'une seule requête. Voici les meilleures pratiques pour rester sous le radar :
Pagination
Google Shopping ne propose pas de pagination classique avec start= comme la SERP web standard. Les résultats supplémentaires se chargent souvent via des requêtes AJAX ou un défilement infini. Pour récupérer plus de résultats, vous pouvez :
- Utiliser le paramètre
start=20(incrément de 20) — fonctionne parfois mais de façon inconstante. - Scrapper la page de détails
/shopping/product/pour chaque produit, qui liste tous les vendeurs. - Utiliser un headless browser (Playwright, Puppeteer) pour simuler le scroll.
Batching de requêtes
Ne lancez pas toutes vos requêtes en parallèle. Regroupez-les par lots de 10 à 20 requêtes avec un délai aléatoire entre chaque lot :
import random
import time
queries = ["ps5", "xbox series x", "switch oled", "steam deck", ...]
BATCH_SIZE = 15
for i in range(0, len(queries), BATCH_SIZE):
batch = queries[i:i + BATCH_SIZE]
for q in batch:
results = scrape_google_shopping(q)
# Traitement...
time.sleep(random.uniform(2.0, 5.0)) # délai randomisé
# Pause plus longue entre les lots
time.sleep(random.uniform(10.0, 20.0))
Détection des soft-blocks
Un soft-block précède généralement un hard CAPTCHA. Apprenez à le détecter tôt :
- Redirection
sorry/index— l'URL de réponse contientsorry/indexau lieu desearch. - Page 429 ou 503 — code de statut HTTP indiquant un rate limiting.
- Contenu « unusual traffic » — la page contient le texte « Our systems have detected unusual traffic ».
- Résultats vides — la SERP se charge mais ne contient aucun produit (0 nœuds
.sh-dgr__content). - Challenge JavaScript — la page ne contient qu'un script de challenge sans contenu.
Si vous détectez un soft-block, arrêtez immédiatement les requêtes sur cette IP, passez à une nouvelle IP via rotation ProxyHat, et attendez 30 à 60 secondes avant de reprendre.
Éthique, conditions d'utilisation et conformité
Scraper des données de prix publiquement visibles n'est pas illégal en soi, mais plusieurs précautions s'imposent :
- Données publiques uniquement — ne tentez pas d'accéder à des pages nécessitant une authentification ou à des données derrière un paywall.
- Respect du
robots.txt— vérifiez les directives de Google pour les chemins que vous scrapez. - CFAA (US) — le Computer Fraud and Abuse Act peut s'appliquer si l'accès dépasse ce qui est « authorized ». Les conditions d'utilisation de Google interdisent le scraping automatisé.
- RGPD (UE) — les prix produits ne sont pas des données personnelles, mais évitez de collecter des données sur les avis utilisateurs qui pourraient contenir des informations identifiantes.
- Volume raisonnable — limitez votre taux de requêtes pour ne pas perturber le service.
Pour les cas d'usage à fort volume ou à enjeu juridique élevé, envisagez les partenaires officiels Google Shopping / SERP qui proposent des APIs conformes avec des accords de licence. C'est plus coûteux mais élimine le risque juridique.
Configuration ProxyHat et liens utiles
Pour configurer votre scraper prix Google Shopping avec ProxyHat, voici les éléments essentiels :
- Gateway HTTP :
gate.proxyhat.com:8080 - Gateway SOCKS5 :
gate.proxyhat.com:1080 - Format utilisateur :
user-country-XX:passouuser-country-XX-city-yyy:pass - Session sticky :
user-session-ID-country-XX:pass
Ressources internes ProxyHat :
- Tarifs ProxyHat — comparez les plans résidentiels, datacenter et mobile.
- Cas d'usage : web scraping — guides pratiques pour le scraping à grande échelle.
- Cas d'usage : SERP tracking — suivez les positions et prix dans les SERPs.
- Locations disponibles — 195+ pays avec géo au niveau ville.
Points clés à retenir
- Le Content API for Shopping ne donne accès qu'à vos propres produits — pour la concurrence, il faut parser le HTML de la SERP
tbm=shop.- Les prix Google Shopping varient par géolocalisation — utilisez des proxies résidentiels avec
user-country-USouuser-country-DE-city-berlin.- Les sélecteurs clés sont
.sh-dgr__content(conteneur produit),.a8Pemb(prix), et[role="heading"](titre).- Détectez les soft-blocks tôt : redirection
sorry/index, 429/503, ou résultats vides.- Utilisez des délais randomisés de 2 à 5 secondes entre les requêtes et des pauses de 10 à 20 secondes entre les lots.
- Respectez les conditions d'utilisation de Google et le RGPD — pour les volumes élevés, envisagez un partenaire SERP officiel.
FAQ
Qu'est-ce que le scraping des prix Google Shopping en 2026 ?
Le scraping des prix Google Shopping consiste à extraire automatiquement les prix, vendeurs et notes de produits depuis les pages de résultats Google Shopping (tbm=shop) et les fiches produits détaillées. Contrairement au Content API for Shopping qui ne sert que vos propres produits, le scraping HTML permet d'obtenir des données concurrentielles sur tous les marchands listés par Google pour un produit donné, dans différents pays et devises.
Pourquoi le scraping Google Shopping importe-t-il pour les utilisateurs de proxies ?
Google applique des rate limits agressifs par IP (50 à 100 requêtes/minute), des redirections sorry/index, et des challenges reCAPTCHA. Sans rotation d'IP, un scraper est bloqué en quelques minutes. Les proxies résidentiels avec géo au niveau pays et ville sont essentiels non seulement pour éviter les blocs, mais aussi pour obtenir des prix localisés corrects — un acheteur US et un acheteur allemand voient des vendeurs et devises différents.
Quel type de proxy fonctionne le mieux pour scraper Google Shopping ?
Les proxies résidentiels sont le meilleur choix pour Google Shopping. Ils offrent des IPs de FAI réels indiscernables du trafic organique, une précision géo au niveau pays et ville, et une latence raisonnable (~200ms). Les proxies datacenter sont rapidement détectés et blacklistés. Les proxies mobiles sont encore plus discrets mais plus coûteux et plus lents (~400ms), ce qui les rend moins adaptés au scraping à grande échelle de prix.
Comment éviter les blocages en scrapant Google Shopping ?
Pour éviter les blocages : (1) utilisez des proxies résidentiels avec rotation par requête via gate.proxyhat.com:8080 ; (2) ajoutez des délais randomisés de 2 à 5 secondes entre les requêtes ; (3) détectez les soft-blocks tôt (redirection sorry/index, HTTP 429/503, résultats vides) et changez d'IP immédiatement ; (4) utilisez des headers réalistes avec User-Agent et Accept-Language correspondant au pays cible ; (5) limitez les lots à 15-20 requêtes avec des pauses de 10 à 20 secondes entre les lots.






