Open Source im professionellen Einsatz
Linux-Magazin 07/2003

Perl durchsucht den Amazon-Produktkatalog per Webservices

Amazon-As

Dem Beispiel des famosen Suchdienstes Google folgend, bietet nun auch das virtuelle Kaufhaus Amazon.com seinen Produktkatalog per XML und Webservice an. Perl-Programmierer nutzen dies und suchen gezielt nach Produkten und Preisen.

905

Oft sind Browser zu unhandlich, um im Amazon-Katalog zu wühlen. Dann ist es praktischer, per Perl-Skript etwa durch alle angebotenen Perl-Bücher zu gehen und jenes herauszusuchen, auf das Amazon den höchsten Preisnachlass gibt. Per Skript könnte auch eine Website das Coverbild einer beliebigen CD darstellen, deren ASIN (Amazon Standard Item Number) sie kennt, oder alle Rolling-Stones-CDs ausgeben, die weniger als 13,99 US-Dollar kosten.

Amazon bietet seit einiger Zeit den programmierbaren Zugriff auf seine Datenbank an. Sowohl eine SOAP-Schnittstelle (Simple Object Access Protocol) als auch eine vereinfachte XML-über-HTTP-Anbindung ist möglich. Für einfache Anfragen mit einigen Parametern, auf die der Server mit Datensätzen antwortet, ist SOAP fast schon überdimensioniert. Daher bürgert es sich in der Webservice-Welt immer mehr ein, dass ein Webserver einfache parametrisierte HTTP-Requests entgegennimmt und mit XML antwortet. Das Programmieren mit Perls »SOAP::Lite« ist zwar kinderleicht, aber mit der folgenden XML/HTTP-Schnittstelle geht es noch einfacher.

Leichter als SOAP

Um das Buch mit der ISBN-Nummer 0201360683 zu finden, genügt bei Amazon.com ein HTTP-Request mit folgender URL:

http://xml.amazon.com/onca/xml2?t=xxx&dev-t=yyy&AsinSearch=0201360683&type=lite&f=xml


Der Request enthält die fünf folgenden Parameter:

  • »t«: Die Amazon-Partner-ID des
    Amazon-Associates-Programms. Sie dient nur dazu, die vom Webservice
    zurückgesandten Links mit der Partner-ID zu bestücken.
    Wer keine hat, gibt »webservices-20« an.
  • »dev-t«: Das Amazon-Developer-Token kann sich jeder
    Entwickler bei Amazon.com unter[3] abholen, wenn er seine
    E-Mail-Adresse hinterlässt und den Nutzungsbedingungen
    zustimmt. Mit dem Token (während dieser Artikel entstand,
    funktionierten beliebige Werte) kann er dann nach den Bestimmungen
    beliebig viele Anfragen senden, wenn er unter der Schmerzgrenze von
    einem Request pro Sekunde bleibt.
  • »AsinSearch«: Die eindeutige Produktnummer auf
    Amazon.com. Bei Büchern ist sie identisch mit deren
    ISBN-Nummer.
  • »type«: Legt mit »lite« oder
    »heavy« fest, ob die Kurz- oder Langform der
    XML-Antwort gewünscht wird.
  • »f«: Setzt mit »xml« das Ausgabeformat
    auf XML.

Der Amazon.com-Webservice wird daraufhin eine XML-Antwort wie in Abbildung 1 zurückschicken, die alle notwendigen Produktdaten des angeforderten Artikels enthält, sowie Links auf die von Amazon angebotenen Abbildungen, den Amazon-Preis, den Listenpreis und vieles mehr.

Abbildung 1: Der Amazon-Webservice antwortet mit diesen XML-Daten auf eine ASIN-Anfrage (Amazon.com Standard Item Number). Gesucht war das Buch mit der ISBN-Nummer 0201360683.

Produktsuche per Katalognummer

Solche Daten lassen sich mit Perl und einem Modul wie »XML::Simple« hervorragend extrahieren und für weitere Forschungen umwandeln und zurechtbiegen. Damit auch das noch einfacher wird, steht unter[2] (und auf dem CPAN) das brandneue Modul »Net::Amazon« zur Verfügung. Listing 1 zeigt, wie schön objektorientiert man so mit dem Amazon-Service spielen kann.

ASIN-Nummer
suchen

01 #!/usr/bin/perl
02 ###########################################
03 # asin_fetch
04 # Mike Schilli, 2003 (m@perlmeister.com)
05 # Fetch book info by ASIN
06 #     asin_fetch 0201360683
07 ###########################################
08 use warnings;
09 use strict;
10 
11 use Net::Amazon;
12 use Net::Amazon::Request::ASIN;
13 
14 my $ua = Net::Amazon->new(
15     token       => 'YOUR_AMZN_TOKEN',
16 );
17 
18 die "usage: $0 asinn(use 0201360683 as " .
19     "an example)n" unless defined $ARGV[0];
20 
21 my $req = Net::Amazon::Request::ASIN->new(
22     asin  => $ARGV[0],
23 );
24 
25   # Response is Net::Amazon::ASIN::Response
26 my $resp = $ua->request($req);
27 
28 if($resp->is_success()) {
29     print $resp->as_string(), "n";
30 } else {
31     print "Error: ",
32           $resp->message(), "n";
33 }

Am Anfang zieht das Skript die beiden Module »Net::Amazon« und »Net::Amazon::Request::ASIN« herein. »Net::Amazon« funktioniert ähnlich wie die bekannte LWP-Library, die zunächst einen User-Agent und einen Request definiert und den Request anschließend an das User-Agent-Objekt weiterreicht.

Das »Net::Amazon«-Objekt nimmt in Zeile 15 das Developer-Token entgegen und führt danach beliebig viele Anfragen aus. Das Skript erwartet die ISBN-Nummer auf der Kommandozeile. Falls sie fehlt, bricht Zeile 18 den Reigen mit einer Usage-Meldung ab. Zeile 21 definiert die ASIN-Anfrage und setzt den »asin«-Parameter auf die angegebene Nummer. Zeile 26 sendet den HTTP-Request an den Amazon-Server, schluckt das zurückkommende XML, analysiert es und legt es im Antwortobjekt »$resp« ab. Dieses Objekt vom Typ »Net::Amazon::Response::ASIN« enthält dann die XML-Daten als Hash-Struktur.

Alle »Net::Amazon::Response::*«-Objekte verfügen über folgende Methoden:

  • »is_success()«: True, wenn die Suche erfolgreich
    war.
  • »is_error()«: Ein Fehler ist aufgetreten.
  • »message()«: Etwaige Fehlermeldung.
  • »as_string()«: Fasst die wichtigsten
    Ergebnisparameter lesbar zusammen.

Der Aufruf von »asin_fetch« mit der ASIN 0596000278 fördert folgendes Buch zutage:

$ asin_fetch 0596000278
Larry Wall/Tom Christiansen/Jon Orwant,
"Programming Perl (3rd Edition)", 2000,
$34.97, 0596000278


Die gefundenen Objekte (»Net::Amazon« nennt sie Properties) sind beispielsweise Bücher, CDs oder Elektrogeräte. Zurzeit unterstützt das Modul explizit »Net::Amazon::Property::Book« sowie »Net::Amazon::Property::Music« - der Rest strandet als Objekt der Klasse »Net::Amazon::Property«. Die »properties()«-Methode eines Response-Objekts gibt eine Liste aller gefundenen Objekte zurück.

Die Basisklasse »Net::Amazon::Property« und ihre Kindklassen enthalten je eine Methode für jeden Produktparameter, den Amazon.com in XML zurückliefert (siehe Tabelle 1). Die Parameter variieren je nach Art des Produkts. So gibt es bei Büchern kein »Artist«-Feld wie bei CDs, sondern einen »Authors«-Eintrag, der wiederum einen Unter-Hash enthält, der unter einem »Author«-Schlüssel entweder einen Einzeleintrag oder eine Referenz auf eine Liste mit Autoren enthält. Um diesen Wirrwarr zu vereinfachen, bieten spezialisierte Objekte wie »Net::Amazon::Property::Book« bequemere Methoden an. Eine Property von diesem Typ gibt mit der zusätzlichen Methode »authors()« die Liste der Autorennamen zurück - ohne Umweg über Unter-Hashes.

Property-Methoden

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Geiz ist geil

    Ein Perl-Skript verfolgt für Schnäppchenjäger die Preisentwicklung auf Amazon und schlägt per E-Mail freudig Alarm, falls sich überwachte Produkte plötzlich verbilligen.

  • Laufzeit-Tacho

    Statt hochgezüchteter Prozessoren helfen oft schon simple Tricks, um Programme zu beschleunigen. Profiler können Engpässe entdecken, in die es sich lohnt, Entwicklungszeit zu investieren.

  • Kein Etikettenschwindel

    Jeder kennt es aus dem Supermarkt: Die Kassiererinnen scannen Barcodes ein. Diese Technik hat aber noch ganz andere Anwendungsmöglichkeiten, jeder kann davon profitieren: Mit einem Lesegerät für 25 Euro lässt sich auch die hauseigene Bibliothek, CD- oder DVD-Sammlung erfassen.

  • Leserbriefe

    Haben Sie Anregungen, Statements oder Kommentare? Dann schreiben Sie an [redaktion@linux-magazin.de]. Die Redaktion behält es sich vor, die Zuschriften und Leserbriefe zu kürzen. Sie veröffentlicht alle Beiträge mit Namen, sofern der Autor nicht ausdrücklich Anonymität wünscht.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.