2011-01-09 102 views
3

我有一個網站(www.7bks.com),用戶可以在其中創建書目列表。目前相當簡單。我已經在使用亞馬遜API將圖書信息,圖像等引入網站。使用Amazon BrowseNodes API做一些有意義的事

我想要做的是以某種方式使用Amazon API撤回類別和/或標籤數據,以創建某種方式在我的網站上瀏覽列表。不幸的是,標籤API方法已停用。

最有可能的候選人是Amazon API的BrowseNodes方法(http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html),但從此調用返回的數據很漂亮無意義的,我希望我們能夠將我們的頭腦融合在一起,並弄清楚如何理解它。

這裏是一個谷歌電子表格,告訴你我得到的數據的種類。我通過BrowseNodes API拿起一個樣品列表(http://www.7bks.com/list/549002),並跑了三本書:

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

縱觀名單,你不要一個人需要知道這些書是什麼,才能看到它可能是關於科幻和幻想的列表。這主要是因爲眼睛擅長丟棄諸如「定製商店」和「小說完整」等無意義的類別。

我嘗試了對類別列表進行重複刪除,或者只查看所有3本書出現的類別,但它仍然是相當垃圾的數據。我很想知道如何將這些數據轉化爲對用戶有意義的內容。

我到目前爲止最好的想法是掃描數據並匹配硬​​編碼列表。因此,像:

如果計數(「科幻奇幻&」)> 3,那麼列表是科幻 如果計數(「企業財務&法」)> 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/

標籤: 當代小說 產品

也許最好給你的代碼解釋如下 Space Opera 科幻小說

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 熱門數學 哲學 科學,技術&醫療 哲學思維 科幻 數學代數數論 產品 經典 形而上學&有遠見 神話&童話 拓撲一般 主題 一般 理論方法 形而上學 人工智能 科學史

http://www.amazon.co.uk/Victoria-Condor-Books-Knut-Hamsun/dp/0285647598/ 當代小說 進口圖書 心理 一般AAS 經典 Short Storie s

回答

2

我到目前爲止最好的想法是掃描數據並匹配硬​​編碼列表。因此,像:

如果計數(「科幻&幻想」)> 3,那麼列表是科幻,如果計數(「企業財務&法」)> 3,那麼列表是商業

我覺得這可能不是一個壞主意?從亞馬遜購買頂級圖書類別,並與其匹配。這不是很優雅,但它會工作。

另外,也許你可以使用從Google Book API dc:主題數據? (雖然我沒有使用它,但也可能是垃圾)。

0

哼哼......首先,治療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 &amp; Fiction</Name> 
      <Ancestors> 
      <BrowseNode> 
       <BrowseNodeId>1000</BrowseNodeId> 
       <Name>Subjects</Name> 
       <IsCategoryRoot>1</IsCategoryRoot> 

的通知 「IsCategoryRoot」?沒有點會高於,因爲這僅僅是如此普通的它並使用它沒有意義。名稱是「主題」圖書,但它是「分類」的電子書,它確實是這樣,似乎更有意義,勾選「IsCategoryRoot」元素。

我不是100%確定你想要做什麼,我不知道python太多,但我確實知道數據庫...我會得到ASIN標識符(這對亞馬遜來說是獨一無二的,這意味着你可以找上amazon.Com同一ASIN,而且,co.uk,法國,德國,等...),放在一個表中,與任何其他的數據你覺得有用一起,創建一個類表,擺在那裏他們的姓名和身份證,然後用一個條目每個下級BrowseNode,與 BrowseNodeID和書籍的ASIN,那麼對於嵌套browsenode(至極的事實是父母或祖先)一個鏈接表,把雙方的孩子ID和他們自己的。顯然,將這​​些類別之前,我會檢查它不已經存在。

這裏的目標是讓每本書有一個記錄,每個類別一個記錄,以及各個類別與書籍之間的鏈接以及它們之間的鏈接。

這樣,從類別中搜索書籍非常容易,反之亦然。

對不起,如果我有點長,但沒有簡短的回答你的問題。希望這可以幫助。

Bernard

相關問題