使用Amazon BrowseNodes API执行有意义的操作
我有一个网站(www.7bks.com),人们创建图书清单。目前它相当简单。我已经在使用Amazon API将书籍信息,图像等提取到网站上。
我想做的是以某种方式使用Amazon API撤回类别和/或标记数据,以创建一些浏览我网站上的列表的方式。不幸的是,标签api方法已经停止。
最有可能的候选者是Amazon API的BrowseNodes方法(http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html)但是从这个调用返回的数据是非常荒谬的,我是希望我们能够集思广益,弄清楚如何理解它。
这是一个谷歌电子表格,向您展示我得到的数据类型。我选择了一个示例列表(http://www.7bks.com/list/549002)并通过BrowseNodes API运行了三本书:
https://spreadsheets.google.com/ccc?key=0ApVjkgehRamudHd5SlNhYllPQkZDSDY1cllfQVBQM1E&hl=en&authkey=CN_MxoAO
将列表视为人类,您不需要知道这些书是什么,以便看到该列表可能与科幻和幻想有关。这主要是因为眼睛擅长丢弃无意义的类别,如“自定义商店”和“小说完成”。
我尝试重复删除类别列表,或只查看所有3本书出现的类别,但它仍然是相当废话的数据。我很想知道如何将这些数据变成对用户有意义的东西。
到目前为止,我最好的想法是扫描数据并匹配硬编码列表。所以类似于:
如果Count(“科幻与幻想”)> 3则列表是科幻
如果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
流行数学
科学,技术和医
艺术与艺术音乐
心灵哲学
亚马逊
数学
建筑与建筑逻辑
当代哲学:1900-
逻辑
经
物理
形而上学
物理哲学
一般
技术
代数数论
人工智能
科学史
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
经
短篇小说
没有找到相关结果
已邀请:
2 个回复
墩瓣茅械
味芯憨
然后在每个BrowseNode内部,它将是这样的:
注意“IsCategoryRoot”?没有比这更高的点,因为这是非常通用的,使用它没有意义。名称是书籍的“主题”,但它是电子书的“类别”,因此检查“IsCategoryRoot”元素似乎更有意义。 我不是100%肯定你想做什么,我不太了解python,但我知道数据库...我会得到书ASIN标识符(这是亚马逊全球独一无二的,这意味着你可以寻找和amazon.Com上的asin一样,但是,co.uk,Fr,de等......),放入一个表格,连同你觉得有用的其他数据,为类别创建一个表格,放在那里他们的名字和id,然后是一个链接表,每个较低级别的BrowseNode有一个条目,带有 BrowseNodeID和book的ASIN,然后对于嵌套的browsenode(事实上是父母或祖先),把他们的孩子id和他们自己的id。显然,在插入这些类别之前,我会检查它是否已经存在。 这里的目标是每本书有一个记录,每个类别一个记录,以及书籍类别之间的链接,以及需要之间的链接。 这样,从类别中搜索书籍非常容易,反之亦然。 对不起,如果我有点长,但你的问题没有简短的答案。希望这可以帮助。 伯纳德