Python 使用Amazon BrowseNodes API做一些有意义的事情

Python 使用Amazon BrowseNodes API做一些有意义的事情,python,amazon,information-extraction,amazon-product-api,Python,Amazon,Information Extraction,Amazon Product Api,我有一个网站(www.7bks.com),人们在那里创建书单。目前情况相当简单。我已经在使用AmazonAPI将书籍信息、图像等拉到网站上 我想做的是以某种方式使用AmazonAPI来提取类别和/或标记数据,以在我的网站上创建某种浏览列表的方式。不幸的是,标记api方法已经停止 最有可能的候选方法是amazonapi()的BrowseNodes方法,但是从这个调用返回的数据是非常荒谬的,我希望我们能够集思广益,找出如何理解它 这里有一个谷歌电子表格,向你展示我得到的数据类型。我选择了一个示例列表

我有一个网站(www.7bks.com),人们在那里创建书单。目前情况相当简单。我已经在使用AmazonAPI将书籍信息、图像等拉到网站上

我想做的是以某种方式使用AmazonAPI来提取类别和/或标记数据,以在我的网站上创建某种浏览列表的方式。不幸的是,标记api方法已经停止

最有可能的候选方法是amazonapi()的BrowseNodes方法,但是从这个调用返回的数据是非常荒谬的,我希望我们能够集思广益,找出如何理解它

这里有一个谷歌电子表格,向你展示我得到的数据类型。我选择了一个示例列表()并通过BrowseNodes API运行了这三本书:

作为一个普通人,你不需要知道这些书是什么,就可以看出这些书很可能是关于科幻和幻想的。这主要是因为eye擅长抛弃“定制商店”和“小说全集”等毫无意义的类别

我试着去重分类列表,或者只查看所有3本书的分类,但仍然是相当垃圾的数据。我希望你能思考一下如何将这些数据转化为对用户有意义的东西

到目前为止,我最好的想法就是扫描数据并匹配硬编码列表。比如:

如果计数(“科幻与幻想”)大于3,则列表为科幻 如果计数(“商业金融与法律”)大于3,则列表为商业

等等

这是非常严格的,但理想情况下,我想建立一个更灵活/强大的东西

欢迎所有建议

我认为这是一个高层次的问题,因此不应该受到调用API方式的影响,但作为参考,我使用Python/Appengine/Webapp

谢谢

汤姆

更新在我的头重重地撞在桌子上之后,我成功地解决了这个问题,我很满意。这并没有那么复杂,但我已经拼凑了一些python代码来实现我想要的。我欢迎任何人改进我的代码或提供建议

代码的基本逻辑如下: 1) 在XML树中,开始的节点(books>subjects)的底部节点是对该书实际内容的最佳猜测。对于这个:它返回“科幻小说”。答对 了 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))
要让您体验输出的味道,请执行以下操作:

书籍:

标签: 当代小说 产品 太空歌剧 科幻小说

心理学 数学史 数理逻辑 一般原子吸收光谱法 通俗数学 科学、技术和医学 艺术与音乐 心灵哲学 亚马逊 数学 架构与逻辑 当代哲学:1900年- 逻辑 经典 物理 形而上学 物理学哲学 一般的 技术 代数数论 人工智能 科学史

当代小说 数学哲学 一般原子吸收光谱法 通俗数学 哲学 科学、技术和医学 心灵哲学 科幻小说 数学 当代哲学:1900年- 代数数论 产品 经典 形而上学与幻想 神话与童话 拓扑学概述 话题 一般的 理论方法 形而上学 人工智能 科学史

当代小说 文学小说 心理的 一般原子吸收光谱法 经典 短篇小说

到目前为止,我最好的想法就是扫描数据并匹配硬编码列表。比如:

如果计数(“科幻与幻想”)大于3,则列表为科幻;如果计数(“商业金融与法律”)大于3,则列表为商业

我想这可能不是个坏主意?从亚马逊抓取顶级图书类别,并与之匹配。虽然不太雅致,但可以用


或者,您也可以使用?(不过我没用过,所以它可能也是垃圾)。

嗯。。首先,当前APi的日期为2011-08-01。也许你可以帮自己看看最新的文档

对我来说,XML非常有意义

可能是因为,当我想正确理解其中一个答案时,我将XML复制到VisualStudioXML编辑器中,在那里我可以打开和关闭节点

结构是这样的:

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

10399
经典
17
文学及;小说
1000
学科
1.
注意“IsCategoryRoot”?没有什么比这更重要的了,因为这只是一种泛化,使用它是没有意义的。书籍的名称是“主题”,但电子书的名称是“类别”,因此检查“IsCategoryRoot”元素似乎更有意义

我不是100%确定你想要做什么,我也不太懂python,但我知道数据库。。。我会把书ASIN identifier(这是亚马逊在世界范围内唯一的,这意味着你可以在amazon.Com上查找相同的ASIN,还有co.uk、Fr、de等等…)放在一个表中,连同你觉得有用的任何其他数据,为类别创建一个表,将它们的名称和id放在那里,然后是一个链接表,每个较低级别的BrowseNode有一个条目 BrowseNodeID和book的ASIN,然后对于嵌套的browsenode(实际上是父母或祖先),将其子id和自己的id放在一起。显然,在插入这些类别之前,我会检查它是否没有