3

私は、書籍リストを作成する Web サイト (www.7bks.com) を持っています。現時点ではかなり単純です。私はすでに Amazon API を使用して、本の情報や画像などをサイトにプルしています。

私がやりたいことは、どうにかして Amazon API を使用してカテゴリやタグ データを取得し、サイトのリストをブラウジングする何らかの方法を作成することです。残念ながら、tag api メソッドは廃止されました。

最も可能性の高い候補は Amazon API の BrowseNodes メソッド ( http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html ) ですが、この呼び出しから返されるデータはかなり無意味であり、私は頭をまとめて、それを理解する方法を見つけられることを願っています。

これは、私が取得したデータの種類を示す Google スプレッドシートです。サンプル リスト ( http://www.7bks.com/list/549002 ) を選び、BrowseNodes API を介して 3 冊の本を実行しました。

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

人間としてリストを見ると、リストがSFとファンタジーに関するものである可能性が高いことを確認するために、本が何であるかを知る必要はありません. それは主に、「カスタム ストア」や「フィクション コンプリート」などの無意味なカテゴリを破棄するのが得意な目だからです。

カテゴリのリストの重複を排除するか、3 本すべてに表示されるカテゴリだけを調べてみましたが、それでもかなりくだらないデータです。このデータをユーザーにとって意味のあるものに変える方法について、ご意見をお待ちしております。

これまでの私の最善の考えは、データをスキャンして、ハードコードされたリストに一致させることです。次のようなものです:

Count("SF & ファンタジー") > 3 の場合、リストは SF です。 Count("ビジネス ファイナンス & 法律") > 3 の場合、リストはビジネスです。

これは非常に厳格ですが、理想的には、もう少し柔軟で強力なものを構築したいと考えています。

すべての提案を歓迎します。

これは高レベルの質問だと思うので、API の呼び出し方法に影響されるべきではありませんが、参考までに Python/Appengine/Webapp を使用しています。

ありがとう

トム

更新机に頭をぶつけた後、この問題を満足のいくように修正することができました。それほど複雑ではありませんが、私が望むことを実行するいくつかの Python コードを一緒にハックしました。私のコードを改善したり、提案を提供したりする人を歓迎します。

基本的に、コードの根底にあるロジックは次のとおりです。1) XML ツリーでは、開始するノード (本 > 主題) の最下部のノードが、本が実際に何について書かれているかを最もよく推測します。例: http://www.amazon.co.uk/Surface-Detail-Iain-M-Banks/dp/1841498939/「サイエンス フィクション」を返します。ビンゴ。2) 通常、最初の結果 (書籍 > 主題) だけに限定することで、多くの有益な情報が失われます。したがって、3) 似たような本のリストを取得して、それらからカテゴリを取得しようとします。それが失敗した場合は、元の本に割り当てられたカテゴリを取得します。

おそらく、次のようにコードを提供することで最もよく説明されます。

#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))

出力のフレーバーを与えるには:

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

タグ: 現代フィクション 製品 スペース オペラ サイエンス フィクション

http://www.amazon.co.uk/Godel-Escher-Bach-Eternal-anniversary/dp/0140289208/ 心理学 数学史 数学的論理 AAS ポピュラー数学 科学、技術、医療 芸術と音楽 心の哲学 Amazon 数学アーキテクチャ& Logic Contemporary Philosophy: 1900- Logic Classics Physics Metaphysics Philosophy of Physics 一般的なテクノロジー 代数的数論 人工知能 科学史

http://www.amazon.co.uk/Flatland-Romance-Dimensions-Dover-Thrift/dp/048627263X/ 現代フィクション 数学哲学 一般 AAS ポピュラー数学哲学 科学的、技術的、医学的精神哲学 サイエンス フィクション 数学 現代哲学: 1900- 代数的数論 製品 古典 形而上学 & 幻想 神話 & おとぎ話 トポロジー 一般的なトピック 一般的な理論的方法 形而上学 人工知能 科学の歴史

http://www.amazon.co.uk/Victoria-Condor-Books-Knut-Hamsun/dp/0285647598/ 現代小説 文芸小説 心理学 一般 AAS 古典 短編小説

4

2 に答える 2

2

これまでの私の最善の考えは、データをスキャンして、ハードコードされたリストに一致させることです。次のようなものです:

Count("SF & ファンタジー") > 3 の場合、リストは SF です。 Count("ビジネス ファイナンス & 法律") > 3 の場合、リストはビジネスです。

これは悪い考えではないと思いますか?Amazon からトップ レベルの書籍カテゴリを取得し、それらと照合します。あまりエレガントではありませんが、うまくいきます。

または、 Google Book APIの dc:subject データを使用できますか? (使ってないのでゴミかもしれませんが)

于 2011-01-09T16:19:24.613 に答える
0

うーん..まず第一に、現在の APi の日付は 2011-08-01 です。たぶん、最新のドキュメントを参照してください。広告製品 API

私にとって、XML は非常に理にかなっています。

おそらく、これらの答えの 1 つを正しく理解したい場合、XML をビジュアル スタジオの XML エディターにコピーして、ノードを開いたり閉じたりできるからです。

構造は次のようなものです。

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

次に、各 BrowseNode 内では、次のようになります。

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

「IsCategoryRoot」に注目してください。これは非常に一般的であり、使用しても意味がないため、それ以上のポイントはありません。名前はBooksの「Subjects」ですが、eBookの「Categories」なので、「IsCategoryRoot」要素をチェックした方が理にかなっているようです。

私はあなたが何をしたいのか100%確信が持てませんし、Pythonについてはあまり知りませんが、データベースは知っています...本のASIN識別子を取得します(これはAmazonにとって世界中で一意です。つまり、 amazon.Com と同じですが、co.uk、Fr、de なども...)、テーブルに入れ、他の有用なデータと一緒に、カテゴリのテーブルを作成し、そこに入れますそれらの名前と ID、次に下位レベルの BrowseNode ごとに 1 つのエントリを持つ 1 つのリンク テーブル、BrowseNodeID と本の ASIN、ネストされた BrowseNode (実際には親または祖先) の子 ID と自分自身の両方を入力します。 . 明らかに、これらのカテゴリを挿入する前に、それがまだ存在しないことを確認します。

ここでの目標は、書籍ごとに 1 つのレコード、カテゴリごとに 1 つのレコード、およびカテゴリと書籍の間、およびそれらの間のリンクを必要な数だけ作成することです。

そうすれば、カテゴリから本を検索するのが非常に簡単になり、その逆も同様です。

少し長くなって申し訳ありませんが、あなたの質問に対する簡単な答えはありません。お役に立てれば。

バーナード

于 2013-05-02T23:08:30.867 に答える