Amazon ist einer der größten öffentlichen Produktkataloge im Web. Jede Produktseite zeigt einen Titel, einen Preis, eine Sternebewertung und einen Verfügbarkeitsstatus, und diese Daten treiben Wettbewerbs-Preisverfolgung, Marktforschung, Sortimentsanalyse und Nachfragemonitoring an. Ein Produkt von Hand zu speichern ist trivial. Hunderte oder Tausende zu speichern erfordert einen Scraper, und dort beginnt Amazon mit seinen Abwehrmechanismen zu reagieren.

Dieser Leitfaden zeigt Ihnen, wie Sie Amazon-Produktdaten in Ruby scrapen. Sie bauen ein kleines, lauffähiges Skript, das eine gerenderte Produktseite über die Crawling API abruft, sie mit Nokogiri parst und einen sauberen Datensatz extrahiert: Produkttitel, Preis, Bewertung und Verfügbarkeit. Das Tutorial beschränkt sich auf öffentliche Produktdaten, und der Abschnitt zur Rechtslage am Ende ist kein Boilerplate, also lesen Sie ihn, bevor Sie dies auf echtes Volumen loslassen.

Was Sie bauen werden

Ein Ruby-Skript, das eine Amazon-Produkt-URL nimmt, die Seite über die Crawling API abruft und mit Nokogiri einen strukturierten Datensatz extrahiert. Wir ziehen diese Felder von der Produktseite:

  • Titel der in der Seitenüberschrift angezeigte Produktname, z. B. "Echo Dot (5th Gen)".
  • Preis der im Buy-Box aufgelistete Preis.
  • Bewertung die durchschnittliche Sternebewertung, sofern das Produkt eine hat.
  • Verfügbarkeit der Lagerstatus, z. B. "In Stock" oder "Currently unavailable".

Warum eine einfache Anfrage bei Amazon scheitert

Wenn Sie eine Amazon-Produkt-URL mit einem einfachen HTTP-Client anfragen, bekommen Sie selten die Seite, die ein Käufer sieht. Zwei Dinge arbeiten gegen Sie. Erstens markiert Amazon automatisierten Traffic schnell: Rechenzentrums-IPs und Anfragemuster, die nicht wie ein echter Browser aussehen, werden mit einem CAPTCHA herausgefordert, einem Robot-Check-Interstitial präsentiert oder gänzlich blockiert, bevor sie das Produkt-Markup erreichen. Zweitens rendert oder ändert sich ein Teil der Seite basierend auf Region, Session und Gerät des Besuchers, sodass ein naiver Fetch oft eine abgespeckte oder inkonsistente Version des Angebots zurückgibt.

Ein funktionierender Amazon-Scraper benötigt also eine IP, die die Plattform als echten Käufer liest, und, wo die Seite auf Rendering angewiesen ist, einen Browser, der die Seite tatsächlich ausführt. Sie können das selbst mit einem Pool aus rotierenden Residential Proxys und einem Headless-Browser zusammenbauen, aber das Zusammenfügen und Gesundhalten dieser Teile ist der Hauptteil der Arbeit. Die Crawling API fasst beides in einem einzigen Aufruf zusammen: Sie senden die URL, sie ruft die Seite hinter einer vertrauenswürdigen Residential-IP ab und behandelt die CAPTCHA-Schicht, und gibt fertiges HTML zum Parsen zurück.

Normales Token vs. JS-Token

Crawlbase bietet zwei Token-Typen. Das normale Token ruft die Seiten-HTML ab und ist die richtige Standardwahl für eine Amazon-Produktseite. Das JavaScript-Token (JS) rendert die Seite zusätzlich in einem echten Browser, was mehr Credits kostet und es wert ist, für Inhalte aufzusparen, die erst nach dem Ausführen clientseitiger Scripts erscheinen. Beginnen Sie hier mit dem normalen Token und wechseln Sie nur dann zum JS-Token, wenn ein benötigtes Feld leer zurückkommt.

Voraussetzungen

Bevor Sie Code schreiben, müssen einige Dinge eingerichtet sein. Keines davon dauert lange.

Ruby-Grundkenntnisse. Sie sollten in der Lage sein, ein Ruby-Skript zu schreiben und auszuführen und Gems zu installieren. Wenn Sie neu in der Sprache sind, bringen Sie die offizielle Ruby-Dokumentation und ein beliebiger Einsteigerkurs auf das Niveau, das dieses Tutorial voraussetzt.

Ruby 2.7 oder neuer. Überprüfen Sie Ihre Version mit ruby --version. Falls nicht vorhanden, installieren Sie Ruby von ruby-lang.org oder über einen Versionsmanager wie rbenv oder rvm.

Ein Crawlbase-Konto und Token. Melden Sie sich an, öffnen Sie Ihr Dashboard und kopieren Sie Ihr normales Anfrage-Token von der Kontoseite. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, halten Sie es also aus der Versionsverwaltung heraus. Crawlbase gibt Ihnen bis zu 20.000 kostenlose Anfragen zum Start, ohne Kreditkarte, und Sie zahlen erst nach diesen für erfolgreiche Anfragen.

Das Projekt einrichten

Erstellen Sie eine Datei namens amazon_scraper.rb für Ihren Code, installieren Sie dann die zwei Gems, die der Scraper benötigt: den offiziellen Crawlbase-Client und Nokogiri zum Parsen.

bash
ruby --version

gem install crawlbase
gem install nokogiri

Zwei Abhängigkeiten übernehmen die Arbeit: crawlbase ist der offizielle Client für die Crawling API, und nokogiri parst das zurückgegebene HTML, sodass Sie jedes Feld per CSS-Selektor aus der Seite herausziehen können. Wenn Sie ein Gemfile bevorzugen, fügen Sie gem 'crawlbase' und gem 'nokogiri' hinzu und führen Sie stattdessen bundle install aus.

Die Amazon-Produktseite verstehen

Eine Amazon-Produktseite organisiert das Angebot in stabile, identifizierbare Elemente. Der Produkttitel sitzt in einer Überschrift mit der id productTitle. Der Preis erscheint in der Buy-Box, die durchschnittliche Bewertung in der Bewertungszusammenfassung und der Lagerstatus in einem Verfügbarkeitsblock. Amazons Markup ist umfangreich und variiert je nach Kategorie, aber diese Kernfelder tragen konsistente ids und Attribute, die Sie gezielt ansprechen können.

Bevor Sie Selektoren schreiben, öffnen Sie eine Produktseite in Ihrem Browser, klicken Sie mit der rechten Maustaste auf den Titel oder Preis und wählen Sie Untersuchen. Notieren Sie die id oder Klasse für jedes Feld, das Sie möchten. Amazon liefert je nach Deal-Typ mehrere Preis-Layouts, daher lohnt es sich, vor dem Festlegen der Selektoren einige Produkte zu prüfen. Die ids wie #productTitle sind die beständigsten Anker; klassenbasierte Preis-Spans ändern sich öfter, also planen Sie, diese gegen eine Live-Seite zu prüfen.

Schritt 1: Die Produktseite abrufen

Beginnen Sie damit, das Seiten-HTML zu laden. Fordern Sie das Crawlbase-Gem an, initialisieren Sie die API mit Ihrem Token, richten Sie es auf eine Produkt-URL und fordern Sie es an. Prüfen Sie den Status-Code vor dem Parsen, damit Fehler laut statt stumm bleiben.

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

Der Aufruf Crawlbase::API.new richtet einen Client ein, der an Ihr Token gebunden ist, und api.get(url) ruft die Seite hinter einer vertrauenswürdigen IP ab. Die Antwort trägt einen status_code und einen body; das Prüfen des Codes vor dem Lesen des Body bedeutet, dass eine Sperre oder ein Fehler sofort auftaucht, statt später einen verwirrenden Parse-Fehler zu verursachen. Führen Sie das aus und Sie sollten echtes Amazon-Produkt-Markup in den ersten 500 Zeichen sehen, keine Robot-Check-Seite. Das bestätigt, dass der Fetch funktioniert, bevor Sie einen einzigen Selektor schreiben.

Crawlbase Amazon Scraper

Dieser einzelne api.get(url)-Aufruf erledigt den schwierigen Teil für Sie. Amazon benötigt eine Anfrage, die von einer IP ankommt, die es als echten Käufer liest und die CAPTCHA-Schicht überwindet, in einem Schuss. Die Crawling API ruft die Seite hinter rotierenden Residential IPs ab und behandelt die Bot-Prüfungen serverseitig, sodass Sie kein eigenes Headless-Browser-Fleet und keinen Proxy-Pool betreiben müssen. Richten Sie es zuerst auf eine Produkt-URL im kostenlosen Tarif aus.

Schritt 2: Die Felder mit Nokogiri parsen

Mit dem Seiten-HTML laden Sie es in Nokogiri und ziehen jedes Feld per Selektor heraus. Amazon exponiert den Titel über die id #productTitle, den Preis über den Buy-Box-Preis-Span, die Bewertung über die Bewertungszusammenfassung und den Lagerstatus über den Verfügbarkeitsblock. Ein kleiner Helfer, der nil zurückgibt, wenn ein Element fehlt, verhindert, dass die Extraktion bei einem Feld abstürzt, das ein bestimmtes Angebot nicht trägt.

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

Der Helfer text_at fragt ein Element ab und gibt seinen getrimmten Text zurück oder nil, wenn das Element fehlt, damit ein fehlendes Feld nie auf einem .text-Aufruf gegen nichts auslöst. Für den Preis zielt .a-price .a-offscreen auf die Screen-Reader-Kopie des Preises ab, was der sauberste einzelne Wert über Amazons verschiedene Preis-Layouts ist. Die Bewertung liest sich aus dem Tooltip-Text von #acrPopover (ein String wie "4.6 out of 5 stars"), und die Verfügbarkeit kommt aus dem #availability-Block. Die ältere Version dieses Tutorials verwendete die alte id #priceblock_ourprice; Amazon ist inzwischen zur Struktur .a-price übergegangen, weshalb das Überprüfen von Selektoren gegen eine Live-Seite wichtig ist.

Selektoren ändern sich

Amazon liefert je nach Produkt, Deal-Typ und Region mehrere Preis- und Verfügbarkeits-Layouts und passt Klassennamen im Laufe der Zeit an. Behandeln Sie die obigen Selektoren als Ausgangssvorlage, nicht als Vertrag. Wenn ein Feld als nil zurückkommt, öffnen Sie die Live-Produktseite in den Dev-Tools Ihres Browsers, finden Sie die aktuelle id oder Klasse und aktualisieren Sie den Selektor. Periodische Selektor-Wartung ist bei jedem Produktions-Scraper normal, kein Zeichen dafür, dass etwas kaputt ist.

Schritt 3: Alles zusammenfügen

Verbinden Sie nun den Fetch und das Parsen zu einem lauffähigen Skript. Rufen Sie die Produktseite ab, übergeben Sie das HTML an den Parser und geben Sie den strukturierten Datensatz aus.

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

Das ist der vollständige Scraper. Er fordert die zwei Gems an, baut den Client, ruft die Seite ab, parst die vier Felder und gibt sie aus. JSON.pretty_generate kommt aus der Standardbibliothek von Ruby, also fügen Sie require 'json' oben hinzu, wenn Ihre Umgebung es nicht automatisch lädt. Tauschen Sie die url gegen ein beliebiges Amazon-Produkt und derselbe Parser verarbeitet es, da die Feld-Selektoren auf der Seitenstruktur, nicht auf dem Produkt basieren.

Wie die Ausgabe aussieht

Führen Sie das Skript mit ruby amazon_scraper.rb aus und Sie erhalten einen sauberen Datensatz, bereit zum Schreiben in JSON, CSV oder eine Datenbank.

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"
}

Von hier aus können Sie den Datensatz speichern, an eine CSV anhängen oder in ein Preis-Dashboard einspeisen. Da der Parser ein einfaches Ruby-Hash zurückgibt, ist das Schreiben in ein beliebiges Format mit der Standardbibliothek ein Einzeiler.

Auf viele Produkte skalieren

Ein Produkt ist ein Demo; ein echter Job läuft über eine Liste von Produkten. Der sauberste Weg zu skalieren besteht darin, Ihre URLs in einem Array zu halten, darüber zu schleifen und jeden geparsten Datensatz zu sammeln. Eine kurze Pause zwischen Anfragen bremst den Lauf, damit Sie Amazon nicht in einer engen Schleife hämmern.

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)

Das next unless-Guard überspringt jede URL, die keinen sauberen 200er zurückgegeben hat, damit eine schlechte Antwort den Lauf nicht stoppt, und sleep 2 zwischen Anfragen hält das Tempo zivilisiert. Wenn Sie Tausende von URLs haben und sie gleichzeitig verarbeiten möchten, ohne eine eigene Queue zu verwalten, ist der asynchrone Crawler genau dafür gebaut. Für das Sammeln von Produkt-URLs greifen der Begleitleitfaden über Amazon-Produktdaten scrapen und der E-Commerce-Web-Scraping-Überblick dort auf, wo dieser aufhört.

Nicht gesperrt bleiben

Selbst mit einer vertrauenswürdigen IP für den Fetch achtet Amazon auf Scraper-ähnlichen Traffic. Einige Gewohnheiten halten einen Lauf gesund, und sie gelten für jedes schwierige kommerzielle Ziel.

  • Drosseln Sie Ihre Anfragen. Verteilen Sie Anfragen mit einer Verzögerung zwischen Produkten, statt eine Liste mit voller Geschwindigkeit zu crawlen. Das sleep 2 in der Schleife ist ein Boden, keine Decke.
  • Setzen Sie auf Rotation. Ein Pool von Residential IPs verteilt Anfragen über viele echte Nutzer-Adressen, sodass keine einzelne ein Rate-Limit auslöst. Die Crawling API erledigt das für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, den Sie richtig machen müssen.
  • Lesen Sie die Status-Codes. Ein Lauf, der beginnt, Herausforderungen oder Fehler zurückzugeben, teilt Ihnen mit, dass die aktuelle Rate oder IP-Tier nicht mehr ausreicht. Behandeln Sie das als Signal zum Zurückziehen, nicht als Rauschen, das ignoriert werden soll.

Das breitere Spielbuch finden Sie in Wie man Websites scrapt, ohne gesperrt zu werden. Wenn Sie in einer anderen Sprache arbeiten möchten, behandelt der Leitfaden Web-Scraping mit Java denselben Ansatz mit einem anderen Toolchain.

Ob das Scrapen von Amazon erlaubt ist, hängt von Amazons Nutzungsbedingungen, Ihrer Rechtsprechung und der Verwendung der Daten ab. Amazons Nutzungsbedingungen beschränken den automatisierten Zugriff, sodass das Scrapen gegen diese Bedingungen verstoßen kann, unabhängig davon, wie sorgfältig Ihr Tooling ist. Kein Code hier ändert das; er macht nur den technischen Teil funktionieren. Lesen Sie Amazons Nutzungsbedingungen und seine robots.txt und behandeln Sie beide als Grenze dessen, was Sie sammeln.

Einige Linien, die es wert sind einzuhalten. Sammeln Sie nur öffentliche Daten: die Produkttitel, Preise, Bewertungen und Verfügbarkeit, die jeder auf einer Produktseite ohne Konto sehen kann. Respektieren Sie die angegebenen Rate-Erwartungen von Amazon und halten Sie Ihr Anfragevolumen niedrig genug, um die Server nicht zu belasten. Vermeiden Sie persönliche Daten, einschließlich allem, das mit identifizierbaren Käufern, Bewerbern oder Verkäufern über das öffentlich Gelistete hinaus zusammenhängt, und verbreiten Sie keine urheberrechtlich geschützten Medien wie Produktbilder oder Bewertungstexte, als wären sie Ihre eigenen. Wenn Sie die Daten kommerziell wiederverwenden möchten, holen Sie eine Erlaubnis oder eine offizielle Vereinbarung ein, statt Schweigen als Zustimmung zu werten.

Dieser Leitfaden beschränkt sich bewusst auf öffentliche Produktseiten, weil das die Linie ist, die die Arbeit vertretbar hält. Er deckt nichts hinter einem Login ab, keine Konto- oder Bestelldaten, keine Zahlungs- oder Checkout-Abläufe und keinen Versuch, Authentifizierung zu umgehen. Für lizenzierten oder Massen-Zugriff bietet Amazon offizielle APIs über seine Product Advertising und Selling Partner Programme, und das ist das richtige Werkzeug, wenn Sie große Volumina, garantierte Struktur oder kommerzielle Rechte benötigen. Wenn Ihr Projekt mehr als öffentliche Angebote benötigt, ist eine offizielle API oder eine Datenvereinbarung der richtige Weg, kein cleverer Scraper.

Zusammenfassung

Wichtigste Erkenntnisse

  • Amazon blockiert naive Anfragen. Ein einfacher HTTP-Client bekommt CAPTCHAs und Robot-Prüfungen, Sie benötigen also eine Anfrage, die von einer vertrauenswürdigen IP ankommt und diese Abwehrmechanismen überwindet.
  • Die Crawling API erledigt den schwierigen Teil. Ein einziger api.get(url)-Aufruf ruft die Seite hinter rotierenden Residential IPs und der CAPTCHA-Schicht ab, sodass Sie kein eigenes Proxy-Pool und Browser-Fleet betreiben müssen.
  • Nokogiri übernimmt die Extraktion. Laden Sie das HTML und ordnen Sie Titel, Preis, Bewertung und Verfügbarkeit aktuellen Selektoren wie #productTitle und .a-price .a-offscreen zu, und erwarten Sie, dass diese Selektoren driften.
  • Skalieren Sie mit einer Schleife und einer Verzögerung. Iterieren Sie eine Liste von Produkt-URLs, prüfen Sie den Status-Code, geben Sie Anfragen mit sleep Pacing und greifen Sie bei hohem Volumen auf den asynchronen Crawler zurück.
  • Bleiben Sie bei öffentlichen Daten. Respektieren Sie Amazons Bedingungen und robots.txt, bevorzugen Sie für lizenzierte oder Massen-Daten eine offizielle Amazon-API und berühren Sie niemals Konten, Bestellungen oder persönliche Informationen.

Häufig gestellte Fragen

Warum scheitert eine einfache Ruby-Anfrage bei Amazon?

Amazon markiert automatisierten Traffic schnell. Eine einfache Net::HTTP- oder open-uri-Anfrage von einer Rechenzentrums-IP bekommt meist ein CAPTCHA, eine Robot-Check-Seite oder eine direkte Sperre statt des Produkt-Markups. Um echte Daten zu erhalten, benötigen Sie eine Anfrage, die von einer IP ankommt, die Amazon als echten Käufer liest und die Bot-Prüfungen überwindet, was die Crawling API für Sie erledigt.

Benötige ich das normale Token oder das JS-Token für Amazon?

Beginnen Sie mit dem normalen Token. Für eine Standard-Amazon-Produktseite gibt das normale Token den Titel, Preis, Bewertung und Verfügbarkeit zurück, die Sie benötigen, und kostet weniger Credits. Wechseln Sie zum JavaScript-Token (JS) nur, wenn ein spezifisches Feld, das Sie möchten, clientseitig rendert und mit dem normalen Token leer zurückkommt.

Welche Selektoren sollte ich für den Preis verwenden?

Verwenden Sie .a-price .a-offscreen, das die Screen-Reader-Kopie des Preises anspricht und der konsistenteste einzelne Wert über Amazons Preis-Layouts ist. Die ältere id #priceblock_ourprice aus früheren Tutorials passt nicht mehr auf die meisten Seiten. Da Amazon mehrere Preis-Layouts liefert, überprüfen Sie den Selektor gegen das Live-Produkt vor einem großen Lauf.

Wie scrappe ich viele Amazon-Produkte gleichzeitig?

Halten Sie Ihre Produkt-URLs in einem Array, schleifen Sie darüber, parsen Sie jede Seite mit derselben Funktion und sammeln Sie die Datensätze. Prüfen Sie den Status-Code, damit eine schlechte Antwort den Lauf nicht stoppt, und fügen Sie ein kurzes sleep zwischen Anfragen hinzu, um Pacing zu gewährleisten. Für Tausende von URLs verarbeitet der asynchrone Crawler sie gleichzeitig, ohne dass Sie eine Queue verwalten müssen.

Kann ich Bestell-, Konto- oder Buy-Box-only-Daten von Amazon scrapen?

Dieser Leitfaden deckt keine login-geschützten Daten ab. Bestellhistorie, Kontodetails und Checkout-Abläufe befinden sich hinter Authentifizierung, sind also keine öffentlichen Daten, und das Scrapen oder Umgehen des Logins verstößt gegen Amazons Bedingungen. Für sanktionierten Zugriff auf reichhaltigere Daten ist eine offizielle Amazon-API oder eine Partner-Vereinbarung der richtige Weg.

Warum Nokogiri statt Regex zum Parsen des HTML verwenden?

Nokogiri parst die Seite in ein ordentliches DOM, sodass Sie Felder per CSS-Selektor oder XPath auswählen und zuverlässige Ergebnisse erhalten, auch wenn sich das Markup darum verschiebt. Reguläre Ausdrücke gegen HTML brechen in dem Moment, in dem Amazon Attribute neu ordnet oder ein Element anders verschachtelt. Für jeden echten Scraper ist ein Parser wie Nokogiri sowohl robuster als auch leichter zu warten.

Jetzt loslegen

Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.

Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.

Self-Service · Kein Verkaufsgespräch erforderlich · Enterprise-Crawl-Volumen verfügbar