2011-01-09 13 views
3

Ich habe eine Website (www.7bks.com), wo Leute Buchlisten erstellen. Es ist im Moment ziemlich einfach. Ich verwende bereits die Amazon API, um Buchinformationen, Bilder usw. auf die Website zu ziehen.Etwas sinnvolles mit Amazon tun BrowseNodes API

Was ich tun möchte, ist irgendwie die Amazon API verwenden, um Kategorie und/oder Tag-Daten zurückziehen, um eine Möglichkeit zum Durchsuchen von Listen auf meiner Website zu erstellen. Leider ist die tag api Methode nicht mehr verfügbar.

Der wahrscheinlichste Kandidat ist die BrowseNodes Methode des Amazon-API (http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html), aber die Daten von diesem Aufruf zurückgegeben wird, ist ziemlich unsinnig und ich hoffte, wir könnten unsere Köpfe zusammensetzen und herausfinden, wie wir es verstehen können.

Hier ist eine Google-Tabelle, um Ihnen die Art von Daten zu zeigen, die ich bekomme. Ich nahm eine Beispielliste (http://www.7bks.com/list/549002) und lief die drei Bücher über das BrowseNodes API:

https://spreadsheets.google.com/ccc?key=0ApVjkgehRamudHd5SlNhYllPQkZDSDY1cllfQVBQM1E&hl=en&authkey=CN_MxoAO

in der Liste der Suche als Mensch nicht tun müssen wissen, was die Bücher sind, um zu sehen, dass es wahrscheinlich die Liste über Sci-Fi und Fantasy ist. Das liegt hauptsächlich daran, dass das Auge gut darin ist, bedeutungslose Kategorien wie "Custom Stores" und "Fiction Complete" zu verwerfen.

Ich habe versucht, die Liste der Kategorien zu entfernen oder nur die Kategorien zu betrachten, die für alle 3 Bücher erscheinen, aber es sind immer noch ziemlich schlechte Daten. Ich würde Ihre Gedanken lieben, wie ich diese Daten in etwas Sinnvolles für die Benutzer verwandeln kann.

Mein bester Gedanke ist bisher, nur die Daten zu scannen und zu einer fest codierten Liste zu passen. So etwas wie:

wenn Count ("Science-Fiction & fantasy")> 3 dann Liste ist sci fi wenn Count ("Business Finance & Gesetz")> 3 dann Liste ist Geschäft

usw.

Dies ist jedoch sehr starr und idealerweise möchte ich etwas flexibler/leistungsfähiger etwas bauen.

Alle Vorschläge willkommen.

Ich denke, das ist eine High-Level-Frage so sollte nicht von WIE ich die API aufrufen, aber ich verwende Python/Appengine/Webapp.

Dank

Tom

UPDATE nach viel Hämmern von Kopf gegen Schreibtisch habe ich es geschafft, das Problem dadurch zu meiner Zufriedenheit zu beheben. Es ist nicht so kompliziert, aber ich habe etwas Python-Code zusammengehackt, der das macht, was ich will. Ich freue mich, wenn jemand meinen Code verbessert oder Vorschläge macht. Der Code, der dem Code zugrunde liegt, ist im Prinzip folgende: 1) In der XML-Baumstruktur ist der untere Knoten eines Knotens, der startet (Bücher> Subjekte), die beste Vermutung, worum es in dem Buch eigentlich geht. Z.B. dafür: http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939/ gibt es "Science-Fiction" zurück. Bingo. 2) In der Regel gibt es eine Menge guter Informationen weggeworfen, indem wir uns auf nur die Ergebnisse beschränken, die beginnen (Bücher> Thema).Daher 3) Ich versuche, eine Liste ähnlicher Bücher zu bekommen und die Kategorien von ihnen zu ziehen, wenn das scheitert, dann bekomme ich nur die Kategorie, die dem ursprünglichen Buch zugeordnet ist.

Vielleicht am besten erklärt Sie den Code, indem Sie wie folgt vor:

#takes as input the xml output of the amazon api browsenodes call 
def getcategories(xml): 
    #fetches the names of all the nodes, stores them in a list 
    categories = []    
    for book in xml.getElementsByTagName('BrowseNode'): 
     category = get_text(book,'Name') 
     categories.append(category) 

    #turn the one list into a series of individual lists 
    #each individual list should be a particular tree from browsenode 
    #each list will end 'Books' 
    #the first item in the list should be the bottom of the tree 
    taglists = [] 
    while 'Books' in categories: 
     find = categories.index('Books') + 1 
     list = categories[:find] 
     taglists.append(list) 
     for word in list: 
      categories.remove(word) 

    #now, we only return the first item from a list which contains 'Subjects'   
    final = []  
    for tagset in taglists: 
     while 'Subjects' in tagset: 
      final.append(tagset[0]) 
      tagset.pop(tagset.index('Subjects')) 
    return final 

class Browsenodes(webapp.RequestHandler): 
    def get(self): 
     #get the asin of the target book 
     asin = self.request.get('term') 
     if book_title: 
      #fetch the amazon key 
      api = API(AWS_KEY, SECRET_KEY, 'uk', processor=minidom_response_parser) 
      try: 
       #try getting a list of similar books - note the response group set to browsenodes 
       result = api.similarity_lookup(asin, ResponseGroup='BrowseNodes') 
      except: 
       #there aren't always a list of similar books, so as a failsafe just get the book I wanted. 
       result = api.item_lookup(asin, ResponseGroup='BrowseNodes') 
      final = getcategories(result) 
      #turn it into a set to de-dupe multiple listings of the same category 
      self.response.out.write(set(final)) 

Sie der Ausgang einen Geschmack zu geben:

Buch: http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939/

Schlagwörter: Gegenwarts Fiction Produkte Space Opera Science Fiction

http://www.amazon.co.uk/Godel-Escher-Bach-Eternal-anniversary/dp/0140289208/ Psychologie Geschichte der Mathematik Mathematische Logik General AAS Beliebte Mathe Scientific, Technical & Medical Kunst & Musik Philosophy of Mind Amazon Mathe Architektur & Logic Philosophie der Gegenwart: 1900- Logic Classics Physik Metaphysik Philosophie der Physik Allgemeine Technologie Algebraische Zahlentheorie Künstliche Intelligenz Wissenschaftsgeschichte

http://www.amazon.co.uk/Flatland-Romance-Dimensions-Dover-Thrift/dp/048627263X/ Gegenwarts Fiction Philosophie der Mathematik General AAS Beliebte Mathe Philosophie Scientific, Technical & Medical Philosophy of Mind Science Fiction Mathe Zeitgenössische Philosophie: 1900- Algebraische Zahlentheorie Produkte Classics Metaphysische & Visionary Mythen & Märchen Topologie Allgemeine Themen Allgemeine Theoretische Methoden Metaphysik Künstliche Intelligenz Wissenschaftsgeschichte

http://www.amazon.co.uk/Victoria-Condor-Books-Knut-Hamsun/dp/0285647598/ Gegenwarts Fiction Literary Fiction Psychologische General AAS Classics Kurze Storie s

Antwort

2

Mein bester Gedanke ist bisher, nur die Daten zu scannen und zu einer fest codierten Liste zu passen. So etwas wie:

wenn Count ("Science-Fiction & fantasy")> 3 ist, dann ist die Liste sci fi, wenn Count ("Business Finance & Gesetz")> 3 dann Liste ist Geschäft

Ich denke, das ist vielleicht keine schlechte Idee?Ergreife die Buchkategorien der obersten Ebene von Amazon und vergleiche sie einfach mit diesen. Es ist nicht sehr elegant, aber es würde funktionieren.

Alternativ könnten Sie vielleicht die DC: Subject Daten von der Google Book API? (Ich habe es nicht benutzt, also kann es auch Müll sein).

0

Hum .. Vor allem ist die aktuelle APi 2011-08-01 datiert. Vielleicht könntest du dir einen Gefallen tun, indem du dir eine aktuelle Dokumentation anschaust? Advertising Products API

Für mich ist XML sehr sinnvoll!

Vielleicht, weil, wenn ich eine dieser Antworten richtig verstehen will, kopiere ich die XML in Visual Studio XML-Editor, wo ich Knoten öffnen und schließen kann.

Die Struktur ist so etwas wie dieses:

<BrowseNodes> 
    <BrowseNode>...</BrowseNode> 
     <BrowseNode>...</BrowseNode> 
     <BrowseNode>...</BrowseNode> 
     <BrowseNode>...</BrowseNode> 
    </BrowseNodes> 

Dann Innenseite jedes browseNode, wird es so etwas wie dieses:

<BrowseNode> 
     <BrowseNodeId>10399</BrowseNodeId> 
     <Name>Classics</Name> 
     <Ancestors> 
     <BrowseNode> 
      <BrowseNodeId>17</BrowseNodeId> 
      <Name>Literature &amp; Fiction</Name> 
      <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>1000</BrowseNodeId> 
       <Name>Subjects</Name> 
       <IsCategoryRoot>1</IsCategoryRoot> 

Beachten Sie die "IsCategoryRoot"? Es gibt keine höheren Punkte als das, da dies nur so generisch ist, macht es keinen Sinn, es zu benutzen. Der Name ist "Themen" für Bücher, aber es ist "Kategorien" für eBooks, so scheint es sinnvoller zu sein, das "IsCategoryRoot" -Element zu überprüfen.

Ich bin nicht 100% sicher, was Sie tun wollen, und ich weiß nicht viel Python, aber ich kenne Datenbanken ... Ich würde das Buch ASIN-Bezeichner bekommen (die weltweit einzigartig für Amazon ist, was Sie bedeutet kann für das gleiche asin auf amazon.Com, sondern auch, co.uk, Fr, de, und so weiter ...), in einer Tabelle, zusammen mit anderen Daten, die Sie nützlich finden, eine Tabelle für Kategorien erstellen , geben Sie dort ihre Namen und ID, dann eine Verknüpfungstabelle mit einem Eintrag für jede untergeordnete BrowseNode, mit der BrowseNodeID und Buch ASIN, dann für die verschachtelte Browsenode (die in Fakten sind die Eltern oder Vorfahren), beide ihre Kinder ID und ihre eigenen. Offensichtlich würde ich vor dem Einfügen dieser Kategorien prüfen, ob es nicht bereits existiert.

Das Ziel ist es, einen Datensatz pro Buch, einen Datensatz pro Kategorie und so viele Links zwischen Kategorien zu Büchern und zwischen ihnen nach Bedarf zu haben.

Auf diese Weise wäre es sehr einfach, Bücher aus Kategorien zu suchen, und umgekehrt.

Sorry, wenn ich ein bisschen lang gewesen bin, aber es gibt keine kurze Antwort auf Ihre Frage. Hoffe das hilft.

Bernard