Comment extraire des données de produits Amazon à grande échelle en Python
Le tutoriel BeautifulSoup en trois lignes fonctionne une fois, puis Amazon vous sert un CAPTCHA. Voici ce qui casse réellement à grande échelle — les sélecteurs de prix changeants, la tarification géographique, les blocages IP — et le pipeline qui y survit.
L'extraction de données de produits Amazon semble triviale dans chaque tutoriel pour débutants : requests, BeautifulSoup, récupérer le titre et le prix, terminé. Cela fonctionne exactement jusqu'à ce que vous l'exécutiez quelques centaines de fois, moment auquel Amazon vous remet une page de vérification robot et votre sélecteur de prix renvoie None. Ce guide concerne la version qui survit au contact avec le site réel — un pipeline axé sur les ASIN, les sélecteurs qui cassent réellement, pourquoi le même produit montre un prix différent à différentes IP, et la configuration de proxy qui vous garde à l'écart du mur CAPTCHA. Il s'agit de données de produits publiques (titres, prix, évaluations, disponibilité), pas de ce qui se trouve derrière une connexion.
La structure de l'URL : les ASINs sont la clé
Chaque produit Amazon a un ASIN — un identifiant de 10 caractères comme B08N5WRWNW — et tout le catalogue en dépend. Une page produit est simplement https://www.amazon.com/dp/<ASIN>, et le même ASIN se retrouve sur les différentes places de marché (amazon.co.uk/dp/<ASIN>, amazon.de/dp/<ASIN>). Les pages de recherche et de catégorie se trouvent sous /s? avec des paramètres de requête et de nœud de navigation. Ainsi, un pipeline évolutif a deux étapes : découvrir les ASINs à partir des pages de recherche ou des meilleures ventes, puis enrichir chacun d'eux à partir de sa page /dp/. Un bémol — un ASIN "parent" (un produit avec des variantes de taille ou de couleur) se résout en une variation enfant auto-sélectionnée, alors capturez l'ASIN de la variante sur laquelle vous êtes réellement tombé.
import requests
from bs4 import BeautifulSoup
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
HEADERS = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"}
def product(asin, domain="com"):
url = f"https://www.amazon.{domain}/dp/{asin}"
r = requests.get(url, headers=HEADERS,
proxies={"http": PROXY, "https": PROXY}, timeout=20)
soup = BeautifulSoup(r.text, "html.parser")
return parse(soup, asin)
Le sélecteur que tout le monde copie et qu'Amazon a retiré
Presque tous les vieux tutoriels lisent le prix depuis span#priceblock_ourprice. Amazon propose plusieurs mises en page de blocs de prix et les teste en A/B, donc cet identifiant unique est vide sur la plupart des pages aujourd'hui. L'approche durable est d'essayer plusieurs conteneurs de prix connus dans l'ordre et de prendre le premier qui correspond — et de traiter un prix manquant comme un état réel (généralement en rupture de stock), pas comme un crash.
def parse(soup, asin):
title = soup.select_one("#productTitle")
price = None
for sel in ["span.a-price span.a-offscreen", # current layout
"#priceblock_ourprice", # legacy
"#priceblock_dealprice", # deal layout
"#corePrice_feature_div .a-offscreen"]:
el = soup.select_one(sel)
if el and el.get_text(strip=True):
price = el.get_text(strip=True)
break
rating = soup.select_one("span.a-icon-alt")
return {
"asin": asin,
"title": title.get_text(strip=True) if title else None,
"price": price, # None -> likely out of stock
"rating": rating.get_text(strip=True) if rating else None,
}

Pourquoi le même produit montre deux prix
C'est le fait qui ruine discrètement les ensembles de données de prix. Amazon localise le prix et la disponibilité à l'emplacement de livraison de l'acheteur — le paramètre "Livrer à" — qu'il déduit principalement de votre IP. Extraire amazon.com depuis une IP de centre de données allemand et vous pourriez obtenir des prix en euros, des offres différentes, ou un gagnant de la Buy Box différent de celui qu'un acheteur américain voit. Si vous collectez des données de prix concurrentielles, la géographie de l'IP de sortie est l'expérience : pour capturer le prix qu'un acheteur américain voit, vous passez par un proxy résidentiel américain ; pour le marché britannique, une sortie britannique. Un produit, plusieurs prix, un par marché que vous échantillonnez.
Obtenez des proxies résidentiels géo-ciblés
Pourquoi les scrapers naïfs sont bloqués
Amazon exécute des systèmes de gestion de requêtes automatisés : explosez trop vite depuis une IP et vous obtenez un CAPTCHA, une interdiction d'IP, ou une page allégée. Trois choses maintiennent un scraper en vie à volume élevé. Premièrement, faites tourner les IPs pour qu'aucune adresse unique ne supporte toute la charge — un pool résidentiel rotatif répartit les requêtes sur de nombreuses IPs de consommateurs réelles. Deuxièmement, dosez-vous : des délais aléatoires et une limite de concurrence, pas une boucle à plein régime. Troisièmement, envoyez des en-têtes cohérents — un vrai User-Agent de navigateur et Accept-Language, pas la chaîne Python par défaut. Lorsqu'une page revient suspectement courte ou contient un marqueur de vérification robot, jetez-la et réessayez avec une nouvelle IP au lieu de parser des déchets.
import time, random
def fetch_many(asins, domain="com"):
rows = []
for asin in asins:
for attempt in range(3):
data = product(asin, domain)
if data["title"]: # got a real page
rows.append(data)
break
time.sleep(1.5 + random.random()) # back off, rotate, retry
time.sleep(random.uniform(1, 3)) # pace between products
return rows
Recherche, meilleures ventes et pagination
Les pages produits sont le détail ; les pages de recherche et de meilleures ventes sont comment vous découvrez quoi récupérer. Une recherche par mot-clé est /s?k=<query>&page=<n> ; les meilleures ventes dépendent des nœuds de navigation de catégorie. Parcourez les pages, extrayez les ASINs de chaque carte de résultat, puis alimentez-les dans l'étape produit ci-dessus. Gardez les deux étapes séparées — cela vous permet de dédupliquer les ASINs, de reprendre un crawl, et de réévaluer une liste d'ASINs connue selon un calendrier sans la redécouvrir à chaque exécution. Pour une construction plus large, notre guide sur les meilleurs proxies pour l'extraction web couvre le côté pool de cela.
Pour la sortie elle-même, gardez le schéma de ligne plat et stable : un asin, l'url source, title, price, rating, le nombre de critiques, une image_url et le domain de la place de marché d'où vous avez extrait. Écrivez le domaine dans chaque ligne pour qu'un ensemble de données de marché mixte ne confonde jamais un prix américain avec un prix britannique. Capturez l'ASIN même lorsque le prix est vide — une lecture en rupture de stock est un point de données, pas un vide, et suivre quand un produit tombe en rupture de stock et revient est souvent aussi précieux que le prix. Un tableau CSV ou de base de données avec ces colonnes s'intègre proprement dans le suivi des prix, les alertes de disponibilité ou une étude de la Buy Box sans autre remodelage.

Proxies vs une API d'extraction : quand changer
Des requests faits maison plus un bon pool résidentiel est le bon choix tant que vous contrôlez le volume et que la cible reste coopérative. Une fois que vous maintenez des sélecteurs rotatifs, la gestion des CAPTCHA, la fixation géographique et la logique de réessai sur des milliers d'ASINs par jour, cet entretien devient le travail. Une Scraper API le simplifie : envoyez une URL Amazon, récupérez des données de produit structurées avec rotation, rendu et géo gérés pour vous. La règle honnête — DIY tant que la friction est faible, changez lorsque l'entretien anti-bot coûte plus de temps d'ingénierie que les données ne valent. Notre analyse construire vs acheter met des chiffres sur cette ligne.
Questions fréquemment posées
Comment extraire des données de produits Amazon avec Python ?
Récupérez la page produit à /dp/<ASIN> avec requests et un vrai User-Agent de navigateur, puis analysez le titre, le prix, l'évaluation et la disponibilité avec BeautifulSoup. Essayez plusieurs sélecteurs de prix, pas seulement le priceblock_ourprice retiré. Passez par un proxy résidentiel rotatif pour que les rafales ne déclenchent pas un blocage, et fixez la géo de sortie au marché dont vous souhaitez la tarification.
Est-il légal d'extraire des données de produits Amazon ?
La collecte de données de produits visibles publiquement — titres, prix, évaluations — est généralement traitée différemment du contournement des connexions ou de la copie de contenu protégé, mais les conditions d'Amazon restreignent l'accès automatisé et le cadre légal varie selon la juridiction et l'utilisation. Ceci est une information générale, pas un conseil juridique : n'extrayez que des données publiques, respectez les limites de taux, et consultez un avocat pour toute activité commerciale ou limite.
Pourquoi mon scraper Amazon obtient-il un prix différent de celui du site web ?
Amazon localise les prix et la disponibilité à l'emplacement de livraison qu'il déduit de votre IP. Si votre proxy sort dans un pays différent de celui du marché que vous étudiez, vous verrez la mauvaise devise et les mauvaises offres. Fixez l'IP de sortie au marché cible — une IP résidentielle américaine pour les prix américains, une IP britannique pour les prix britanniques — pour que les données correspondent à ce qu'un vrai acheteur y voit.
Comment éviter d'être bloqué en extrayant Amazon ?
Faites tourner sur de nombreuses IPs résidentielles pour qu'aucune adresse unique ne supporte la charge, régulez avec des délais aléatoires et une limite de concurrence, et envoyez des en-têtes de navigateur cohérents. Validez chaque réponse — un 200 peut toujours être une page de vérification robot — et réessayez avec une nouvelle IP plutôt que de parser une page bloquée. À haut volume, une Scraper API gère tout cela pour vous.
Amazon à grande échelle n'est pas difficile parce que le parsing est difficile — c'est difficile parce que le site se défend et que le prix dépend de l'endroit où vous vous trouvez. Construisez axé sur les ASIN, faites correspondre plusieurs conteneurs de prix, fixez votre géo, faites tourner vos IPs, et traitez une réponse courte comme un blocage, pas des données. Faites cela correctement et le tutoriel pour débutants s'adapte enfin à l'échelle.