我有一个人们创建图书清单的网站(www.7bks.com)。目前它相当简单。我已经在使用亚马逊API将图书信息,图片等提取到网站上。
我想做的是以某种方式使用Amazon API撤回类别和/或标记数据,以创建一些浏览我网站上的列表的方式。不幸的是,标签api方法已经停止。
最有可能的候选者是亚马逊API的浏览节点方法(http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html)但是从这个调用返回的数据是非常荒谬的,我希望我们能够把我们的头放在一起并弄清楚如何理解它。
这是一个谷歌电子表格,向您展示我得到的数据类型。我选择了一个示例列表(http://www.7bks.com/list/549002)并通过BrowseNodes API运行了三本书:
将该列表视为人类,您不需要知道这些书是什么,以便看到该列表可能是关于科幻和幻想的。这主要是因为眼睛善于摒弃无意义的类别,如“自定义商店”和“小说完成”。
我尝试重复删除类别列表,或只查看所有3本书的类别,但它仍然是相当废话的数据。我很想知道如何将这些数据变成对用户有意义的东西。
到目前为止,我最好的想法是扫描数据并匹配硬编码列表。如下所示:
如果Count(“科幻与幻想”)> 3然后列表是科幻 如果Count(“商业金融与法律”)> 3然后列表是业务
等
这是非常严格的,理想情况下我想建立一些更灵活/更强大的东西。
欢迎所有建议。
我认为这是一个高级别的问题,所以不应该受到如何调用API的影响,但作为参考,我使用的是Python / Appengine / Webapp。
由于
汤姆
UPDATE 经过多次撞击桌面后我已经设法解决了这个问题让我满意。它并没有那么复杂,但我已经将一些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 经 短篇小说
答案 0 :(得分:2)
到目前为止,我最好的想法是扫描数据并匹配硬编码列表。如下所示:
如果Count(“科幻与幻想”)> 3然后列表是sci fi if Count(“business finance& law”)> 3然后列表是业务
我认为这可能不是一个坏主意?从亚马逊获取顶级图书类别并与之匹配。它不是很优雅但它会起作用。
或者,也许您可以使用Google Book API中的dc:subject数据? (我没有使用它,所以它也可能是垃圾)。
答案 1 :(得分:0)
Hum ..首先,the curent APi的日期是2011-08-01。也许你可以通过查看最新的文档帮自己一个忙? Advertising Products API
对我而言,XML非常有意义!
也许是因为,当我想要正确理解其中一个答案时,我将XML复制到visual studio 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 & Fiction</Name>
<Ancestors>
<BrowseNode>
<BrowseNodeId>1000</BrowseNodeId>
<Name>Subjects</Name>
<IsCategoryRoot>1</IsCategoryRoot>
注意“IsCategoryRoot”?没有比这更高的点,因为这是非常通用的,使用它没有意义。名称是书籍的“主题”,但它是电子书的“类别”,因此检查“IsCategoryRoot”元素似乎更有意义。
我不是100%肯定你想做什么,我不太了解python,但我知道数据库......我会得到这本书的ASIN标识符(这对亚马逊来说是独一无二的,这意味着你可以在amazon.Com上寻找相同的asin,但是,co.uk,Fr,de等等......),放入表格,以及您感觉有用的任何其他数据,为类别创建表格,在那里放入他们的名字和id,然后是一个链接表,每个下级BrowseNode有一个条目,带有 BrowseNodeID和book的ASIN,然后对于嵌套的browsenode(事实上是父母或祖先),把他们的孩子id和他们自己的id。显然,在插入这些类别之前,我会检查它是否已经存在。
这里的目标是每本书有一个记录,每个类别一个记录,以及书籍类别之间的链接以及需要之间的链接。
这样,从类别中搜索书籍非常容易,反之亦然。
很抱歉,如果我有点长,但你的问题没有简短的答案。希望这会有所帮助。
伯纳德