Amazon est l'un des plus grands catalogues publics de données produit du web. Chaque page produit expose un titre, un prix, une note en étoiles et un statut de disponibilité, et ces données alimentent le suivi concurrentiel des prix, l'étude de marché, l'analyse de l'assortiment et la surveillance de la demande. Sauvegarder un produit à la main est trivial. En sauvegarder des centaines ou des milliers, c'est là que vous avez besoin d'un scraper, et où les défenses d'Amazon commencent à réagir.

Ce guide vous montre comment scraper des données Amazon en Ruby. Vous construisez un script léger et fonctionnel qui récupère une page produit rendue via la Crawling API, la parse avec Nokogiri, et extrait un enregistrement propre : titre du produit, prix, note et disponibilité. Le tutoriel reste limité aux données publiques de produits, et la section légalité vers la fin n'est pas du remplissage, lisez-la avant de pointer ce code sur un volume réel.

Ce que vous allez construire

Un script Ruby qui prend une URL de produit Amazon, récupère la page via la Crawling API, et extrait un enregistrement structuré avec Nokogiri. Nous extrayons ces champs depuis la page produit :

  • Titre le nom du produit affiché dans l'en-tête de la page, par exemple "Echo Dot (5th Gen)".
  • Prix le prix affiché dans le bloc d'achat.
  • Note la note en étoiles moyenne, quand le produit en a une.
  • Disponibilité le statut de stock, par exemple "In Stock" ou "Currently unavailable".

Pourquoi une requête simple échoue sur Amazon

Si vous demandez une URL de produit Amazon avec un client HTTP basique, vous obtenez rarement la page qu'un acheteur voit. Deux choses jouent contre vous. Premièrement, Amazon signale rapidement le trafic automatisé : les IPs de datacenter et les schémas de requêtes qui ne ressemblent pas à un vrai navigateur sont challengés par un CAPTCHA, soumis à une vérification robot, ou bloqués purement et simplement avant d'atteindre le markup produit. Deuxièmement, certaines parties de la page se rendent ou changent selon la région du visiteur, sa session et son appareil, de sorte qu'une simple requête renvoie souvent une version tronquée ou incohérente de l'annonce.

Un scraper Amazon fonctionnel a donc besoin d'une IP que la plateforme lit comme un vrai acheteur et, là où la page s'appuie sur le rendu, d'un navigateur qui exécute réellement la page. Vous pouvez assembler cela vous-même avec un pool de proxies résidentiels rotatifs et un navigateur headless, mais les assembler et les maintenir en état représente l'essentiel du travail. La Crawling API regroupe les deux en un seul appel : vous lui envoyez l'URL, elle récupère la page derrière une IP résidentielle de confiance et gère la couche CAPTCHA, et renvoie le HTML fini à parser.

Token normal vs token JS

Crawlbase propose deux types de token. Le token normal récupère le HTML de la page et est le bon choix par défaut pour une page produit Amazon. Le token JavaScript (JS) rend en plus la page dans un vrai navigateur, ce qui coûte plus de crédits et vaut la peine d'être réservé au contenu qui n'apparaît qu'après l'exécution des scripts côté client. Commencez avec le token normal ici et passez au token JS uniquement si un champ dont vous avez besoin revient vide.

Prérequis

Vous avez besoin de quelques éléments en place avant d'écrire du code. Aucun ne prend longtemps.

Ruby de base. Vous devez être à l'aise pour écrire et exécuter un script Ruby et installer des gems. Si vous êtes nouveau dans le langage, la documentation officielle Ruby et tout cours pour débutants vous amèneront au niveau que ce tutoriel suppose.

Ruby 2.7 ou ultérieur. Confirmez votre version avec ruby --version. Si vous ne l'avez pas, installez-le depuis ruby-lang.org ou via un gestionnaire de versions comme rbenv ou rvm.

Un compte Crawlbase et un token. Inscrivez-vous, ouvrez votre tableau de bord, et copiez votre token de requête normal depuis la page du compte. Traitez le token comme un mot de passe : il authentifie vos requêtes, donc gardez-le hors du contrôle de version. Crawlbase vous offre jusqu'à 20 000 requêtes gratuites pour commencer, sans carte requise, et vous ne payez que les requêtes réussies après cela.

Configurer le projet

Créez un fichier nommé amazon_scraper.rb pour votre code, puis installez les deux gems dont le scraper a besoin : le client officiel Crawlbase et Nokogiri pour le parsing.

bash
ruby --version

gem install crawlbase
gem install nokogiri

Deux dépendances font le travail : crawlbase est le client officiel de la Crawling API, et nokogiri parse le HTML renvoyé pour que vous puissiez extraire chaque champ de la page par sélecteur CSS. Si vous préférez un Gemfile, ajoutez gem 'crawlbase' et gem 'nokogiri' et lancez bundle install à la place.

Comprendre la page produit Amazon

Une page produit Amazon organise l'annonce en éléments stables et identifiables. Le titre du produit se trouve dans un en-tête avec l'id productTitle. Le prix apparaît dans le bloc d'achat, la note moyenne dans le résumé des avis, et le statut de stock dans un bloc de disponibilité. Le markup d'Amazon est volumineux et varie selon la catégorie, mais ces champs principaux portent des ids et attributs cohérents que vous pouvez cibler.

Avant d'écrire des sélecteurs, ouvrez une page produit dans votre navigateur, faites un clic droit sur le titre ou le prix, et choisissez Inspecter. Notez l'id ou la classe sur chaque champ que vous voulez. Amazon livre plusieurs mises en page de prix selon le type de promotion, donc il est utile de regarder quelques produits avant de fixer les sélecteurs. Les ids comme #productTitle sont les ancres les plus durables ; les spans de prix basés sur des classes changent plus souvent, donc prévoyez de les vérifier sur une page live.

Étape 1 : Récupérer la page produit

Commencez par obtenir le HTML de la page. Requérez la gem Crawlbase, initialisez l'API avec votre token, pointez-la sur une URL produit, et demandez-la. Vérifiez le code de statut avant de parser pour que les erreurs restent visibles plutôt que silencieuses.

ruby
require 'crawlbase'

api = Crawlbase::API.new(token: 'YOUR_CRAWLBASE_TOKEN')
url = 'https://www.amazon.com/dp/B09B8V1LZ3'

response = api.get(url)

if response.status_code == 200
  html = response.body
  puts html[0..500]
else
  puts "Request failed: #{response.status_code}"
end

L'appel Crawlbase::API.new configure un client lié à votre token, et api.get(url) récupère la page derrière une IP de confiance. La réponse porte un status_code et un body ; vérifier le code avant de lire le body signifie qu'un blocage ou une erreur se remarque immédiatement plutôt que de produire un échec de parsing confus plus tard. Lancez ceci et vous devriez voir le vrai markup produit Amazon dans les 500 premiers caractères, pas une page de vérification robot. Cela confirme que le fetch fonctionne avant d'écrire un seul sélecteur.

Crawlbase Amazon Scraper

Cet unique appel api.get(url) fait la partie difficile pour vous. Amazon a besoin d'une requête qui arrive depuis une IP qu'il lit comme un vrai acheteur et qui franchit la couche CAPTCHA, en un seul coup. La Crawling API récupère la page derrière des IPs résidentielles rotatives et gère les vérifications bot côté serveur, pour que vous n'ayez pas à gérer vous-même une flotte de navigateurs headless et un pool de proxies. Pointez-la sur une URL produit sur le niveau gratuit d'abord.

Étape 2 : Parser les champs avec Nokogiri

Avec le HTML de la page en main, chargez-le dans Nokogiri et extrayez chaque champ par son sélecteur. Amazon expose le titre via l'id #productTitle, le prix via le span de prix du bloc d'achat, la note via le résumé des avis, et le statut de stock via le bloc de disponibilité. Un petit helper qui renvoie nil quand un élément est absent empêche l'extraction de planter sur un champ qu'une annonce donnée ne porte pas.

ruby
require 'nokogiri'

def text_at(doc, selector)
  node = doc.at_css(selector)
  node ? node.text.strip : nil
end

def parse_product(html)
  doc = Nokogiri::HTML(html)

  title = text_at(doc, '#productTitle')
  price = text_at(doc, '.a-price .a-offscreen')
  rating = text_at(doc, '#acrPopover .a-icon-alt')
  availability = text_at(doc, '#availability')

  {
    title: title,
    price: price,
    rating: rating,
    availability: availability
  }
end

Le helper text_at interroge un élément et renvoie son texte nettoyé, ou nil quand l'élément est absent, de sorte qu'un champ manquant ne lève jamais d'exception sur un appel .text sur rien. Pour le prix, .a-price .a-offscreen cible la copie lecteur d'écran du prix, qui est la valeur unique la plus cohérente sur les différentes mises en page de prix d'Amazon. La note est lue depuis le texte infobulle de #acrPopover (une chaîne comme "4.6 out of 5 stars"), et la disponibilité vient du bloc #availability. L'ancienne version de ce tutoriel utilisait l'id #priceblock_ourprice ; Amazon est depuis passé à la structure .a-price, ce qui explique pourquoi vérifier les sélecteurs sur une page live est important.

Les sélecteurs évoluent

Amazon livre plusieurs mises en page de prix et de disponibilité selon le produit, le type de promotion et la région, et ajuste les noms de classe au fil du temps. Traitez les sélecteurs ci-dessus comme un modèle de départ, pas comme un contrat. Quand un champ revient nil, ouvrez la page produit live dans les outils de développement de votre navigateur, trouvez l'id ou la classe actuelle, et mettez à jour le sélecteur. La maintenance périodique des sélecteurs est normale pour tout scraper en production, ce n'est pas le signe que quelque chose est cassé.

Étape 3 : Assembler le tout

Câblez maintenant le fetch et le parse en un seul script exécutable. Récupérez la page produit, passez le HTML au parser, et affichez l'enregistrement structuré.

ruby
require 'crawlbase'
require 'nokogiri'

api = Crawlbase::API.new(token: 'YOUR_CRAWLBASE_TOKEN')

def text_at(doc, selector)
  node = doc.at_css(selector)
  node ? node.text.strip : nil
end

def parse_product(html)
  doc = Nokogiri::HTML(html)
  {
    title: text_at(doc, '#productTitle'),
    price: text_at(doc, '.a-price .a-offscreen'),
    rating: text_at(doc, '#acrPopover .a-icon-alt'),
    availability: text_at(doc, '#availability')
  }
end

url = 'https://www.amazon.com/dp/B09B8V1LZ3'
response = api.get(url)

if response.status_code == 200
  product = parse_product(response.body)
  product[:url] = url
  puts JSON.pretty_generate(product)
else
  puts "Request failed: #{response.status_code}"
end

C'est le scraper complet. Il requiert les deux gems, construit le client, récupère la page, parse les quatre champs, et les affiche. JSON.pretty_generate vient de la bibliothèque standard de Ruby, donc ajoutez require 'json' en tête si votre environnement ne le charge pas automatiquement. Remplacez l'url par n'importe quel produit Amazon et le même parser le gère, car les sélecteurs de champs sont basés sur la structure de la page, pas sur le produit spécifique.

À quoi ressemble la sortie

Lancez le script avec ruby amazon_scraper.rb et vous obtenez un enregistrement propre, prêt à écrire en JSON, CSV ou dans une base de données.

json
{
  "title": "Echo Dot (5th Gen, 2022 release) | Smart speaker with Alexa | Charcoal",
  "price": "$49.99",
  "rating": "4.7 out of 5 stars",
  "availability": "In Stock",
  "url": "https://www.amazon.com/dp/B09B8V1LZ3"
}

De là, vous pouvez stocker l'enregistrement, l'ajouter à un CSV, ou l'alimenter dans un tableau de bord de tarification. Comme le parser renvoie un hash Ruby ordinaire, l'écrire dans n'importe quel format est une ligne avec la bibliothèque standard.

Monter en charge sur plusieurs produits

Un produit est une démo ; un vrai travail traite une liste de produits. La façon la plus propre de monter en charge est de garder vos URLs dans un tableau, de les parcourir en boucle, et de collecter chaque enregistrement parsé. Une courte pause entre les requêtes rythme l'exécution pour ne pas marteler Amazon dans une boucle serrée.

ruby
urls = [
  'https://www.amazon.com/dp/B09B8V1LZ3',
  'https://www.amazon.com/dp/B07FZ8S74R',
  'https://www.amazon.com/dp/B08N5WRWNW'
]

results = []

urls.each do |url|
  response = api.get(url)
  next unless response.status_code == 200

  product = parse_product(response.body)
  product[:url] = url
  results << product
  puts "Scraped: #{product[:title]}"

  sleep 2
end

puts JSON.pretty_generate(results)

La garde next unless saute toute URL qui n'a pas renvoyé un 200 propre pour qu'une mauvaise réponse n'arrête pas l'exécution, et sleep 2 entre les requêtes garde un rythme civil. Si vous avez des milliers d'URLs et souhaitez qu'elles soient traitées de façon concurrente sans gérer votre propre file d'attente, le Crawler asynchrone est conçu pour ça. Pour collecter des URLs de produits en premier lieu, le guide compagnon sur le scraping de données produit Amazon et la vue d'ensemble du scraping web e-commerce prennent le relais là où celui-ci s'arrête.

Rester non bloqué

Même avec une IP de confiance gérant le fetch, Amazon surveille le trafic à l'allure d'un scraper. Quelques habitudes maintiennent une exécution en bonne santé, et elles s'appliquent à toute cible commerciale exigeante.

  • Rythmez vos requêtes. Répartissez les requêtes avec un délai entre les produits plutôt que de crawler une liste à pleine vitesse. Le sleep 2 dans la boucle est un plancher, pas un plafond.
  • Appuyez-vous sur la rotation. Un pool d'IPs résidentielles répartit les requêtes sur de nombreuses adresses d'utilisateurs réels pour qu'aucune ne déclenche une limite de débit. La Crawling API gère cela pour vous ; si vous montez votre propre stack, c'est la partie à soigner.
  • Lisez les codes de statut. Une exécution qui commence à renvoyer des défis ou des erreurs vous dit que le taux actuel ou le niveau d'IP n'est plus suffisant. Traitez ça comme un signal de recul, pas du bruit à ignorer.

Pour le guide complet, consultez comment scraper des sites sans être bloqué. Si vous préférez travailler dans un autre langage, le guide scraping web avec Java couvre la même approche avec une chaîne d'outils différente.

Est-il légal de scraper Amazon ?

La légitimité du scraping Amazon dépend des conditions d'utilisation d'Amazon, de votre juridiction, et de ce que vous faites des données. Les conditions d'utilisation d'Amazon restreignent l'accès automatisé, de sorte que le scraping peut contrevenir à ces conditions quelle que soit la qualité de vos outils. Aucun code ici ne change cela ; il rend simplement la partie technique fonctionnelle. Lisez les conditions d'utilisation d'Amazon et son robots.txt, et traitez les deux comme la limite de ce que vous collectez.

Quelques lignes à respecter. Collectez uniquement les données publiques : les titres, prix, notes et disponibilités de produits que tout le monde peut voir sur une page produit sans compte. Respectez les attentes de débit d'Amazon et gardez votre volume de requêtes suffisamment bas pour ne pas surcharger ses serveurs. Évitez les données personnelles, y compris tout ce qui est lié à des acheteurs, critiques ou vendeurs identifiables au-delà de ce qui est publiquement listé, et ne redistribuez pas des médias protégés par des droits d'auteur tels que des images de produits ou des textes d'avis comme s'ils vous appartenaient. Si vous prévoyez de réutiliser les données commercialement, obtenez une permission ou un accord officiel plutôt que de supposer que le silence vaut consentement.

Ce guide est délibérément limité aux pages publiques de produits car c'est la ligne qui rend le travail défendable. Il ne couvre rien derrière une connexion, les données de compte ou de commande, les flux de paiement ou de checkout, ni aucune tentative de contourner l'authentification. Pour un accès sous licence ou en volume, Amazon propose des API officielles via ses programmes Product Advertising et Selling Partner, et c'est le bon outil quand vous avez besoin de grands volumes, d'une structure garantie ou de droits commerciaux. Si votre projet a besoin de plus que des annonces publiques, une API officielle ou un accord de données est la bonne voie, pas un scraper plus ingénieux.

Récapitulatif

Points clés

  • Amazon bloque les requêtes naïves. Un client HTTP basique reçoit des CAPTCHAs et des vérifications robot, vous avez donc besoin d'une requête qui arrive depuis une IP de confiance et franchit ces défenses.
  • La Crawling API gère la partie difficile. Un seul appel api.get(url) récupère la page derrière des IPs résidentielles rotatives et la couche CAPTCHA, pour que vous n'ayez pas à gérer votre propre pool de proxies et votre flotte de navigateurs.
  • Nokogiri fait l'extraction. Chargez le HTML et mappez titre, prix, note et disponibilité sur les sélecteurs actuels comme #productTitle et .a-price .a-offscreen, et attendez-vous à ce que ces sélecteurs évoluent.
  • Montez en charge avec une boucle et un délai. Itérez une liste d'URLs de produits, gardez sur le code de statut, rythmez les requêtes avec sleep, et passez au Crawler async pour les grands volumes.
  • Restez sur les données publiques. Respectez les conditions d'Amazon et robots.txt, préférez une API Amazon officielle pour les données sous licence ou en volume, et ne touchez jamais aux comptes, commandes ou informations personnelles.

Foire aux questions

Pourquoi une simple requête Ruby échoue-t-elle sur Amazon ?

Amazon signale rapidement le trafic automatisé. Une requête Net::HTTP ou open-uri basique depuis une IP de datacenter reçoit généralement un CAPTCHA, une page de vérification robot, ou un blocage pur à la place du markup produit. Pour obtenir de vraies données, vous avez besoin d'une requête qui arrive depuis une IP qu'Amazon lit comme un vrai acheteur et qui franchit les vérifications bot, ce que gère la Crawling API.

Ai-je besoin du token normal ou du token JS pour Amazon ?

Commencez avec le token normal. Pour une page produit Amazon standard, le token normal renvoie le titre, le prix, la note et la disponibilité dont vous avez besoin, et coûte moins de crédits. Passez au token JavaScript (JS) uniquement si un champ spécifique que vous voulez se rend côté client et revient vide avec le token normal.

Quels sélecteurs dois-je utiliser pour le prix ?

Utilisez .a-price .a-offscreen, qui cible la copie lecteur d'écran du prix et est la valeur unique la plus cohérente sur les différentes mises en page de prix d'Amazon. L'ancien id #priceblock_ourprice des tutoriels précédents ne correspond plus à la plupart des pages. Comme Amazon livre plusieurs mises en page de prix, vérifiez le sélecteur sur le produit live avant une grande exécution.

Comment scraper plusieurs produits Amazon à la fois ?

Gardez vos URLs de produits dans un tableau, parcourez-les en boucle, parsez chaque page avec la même fonction, et collectez les enregistrements. Gardez sur le code de statut pour qu'une mauvaise réponse n'arrête pas l'exécution, et ajoutez un court sleep entre les requêtes pour la rythmer. Pour des milliers d'URLs, le Crawler asynchrone les traite de façon concurrente sans que vous gériez une file d'attente.

Puis-je scraper les données de commande, de compte ou de Buy Box uniquement sur Amazon ?

Ce guide ne couvre pas les données derrière une connexion. L'historique des commandes, les détails du compte et les flux de checkout se trouvent derrière l'authentification, ne sont donc pas des données publiques, et les scraper ou contourner la connexion va à l'encontre des conditions d'Amazon. Pour un accès sanctionné à des données plus riches, la bonne voie est une API Amazon officielle ou un accord partenaire.

Pourquoi utiliser Nokogiri plutôt qu'une regex pour parser le HTML ?

Nokogiri parse la page dans un DOM propre, de sorte que vous sélectionnez les champs par sélecteur CSS ou XPath et obtenez des résultats fiables même quand le markup autour d'eux change. Les expressions régulières sur du HTML cassent dès qu'Amazon réordonne les attributs ou imbrique un élément différemment. Pour tout vrai scraper, un parser comme Nokogiri est à la fois plus robuste et plus facile à maintenir.

Commencer à construire

Crawlez n'importe quel site à grande échelle, sans combattre l'infrastructure.

Crawlbase gère les proxies, les empreintes et les CAPTCHA afin que votre équipe livre des pipelines de données au lieu de maintenir la plomberie de crawl. 1 000 requêtes gratuites, sans carte requise.

En libre-service · Sans appel commercial requis · Volumes de crawl entreprise disponibles