Делать что-то осмысленное с API Amazon BrowseNodes - PullRequest
3 голосов
/ 09 января 2011

У меня есть веб-сайт (www.7bks.com), где люди создают списки книг. Это довольно просто на данный момент. Я уже использую Amazon API для загрузки информации о книге, изображений и т. Д. На сайт.

Что я хотел бы сделать, так это каким-то образом использовать API-интерфейс Amazon для получения данных категории и / или тегов, чтобы создать какой-либо способ просмотра списков на моем сайте. К сожалению, метод тега API больше не поддерживается.

Наиболее вероятным кандидатом является метод BrowseNodes API Amazon (http://docs.amazonwebservices.com/AWSEcommerceService/2005-10-05/ApiReference/BrowseNodesResponseGroup.html), но данные, возвращаемые этим вызовом, довольно бессмысленные, и я надеялся, что мы сможем собрать воедино наши головы и выяснить, как понять это.

Вот электронная таблица Google, чтобы показать вам, какие данные я получаю. Я выбрал образец списка (http://www.7bks.com/list/549002) и провел три книги через API BrowseNodes:

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

Глядя на список как на человека, вам не нужно знать, что это за книги, чтобы понять, что, скорее всего, этот список о Sci-Fi и Fantasy. Хотя это главным образом потому, что глаз хорошо отбрасывает бессмысленные категории, такие как «пользовательские магазины» и «художественная литература завершена».

Я пытался де-дуплицировать список категорий или только смотреть на категории, которые появляются для всех трех книг, но это все еще довольно дерьмовые данные. Мне бы очень хотелось, чтобы вы подумали, как я могу превратить эти данные во что-то значимое для пользователей.

Моя лучшая мысль на данный момент - просто сканировать данные и сопоставлять их с жестко закодированным списком. Так что-то вроде:

если Count ("научная фантастика и фэнтези")> 3, то список научный если Count ("бизнес финансы и право")> 3, то список - это бизнес

и т.д.

Это очень жестко, но в идеале я хотел бы создать что-то более гибкое / мощное.

Все предложения приветствуются.

Я думаю, что это вопрос высокого уровня, поэтому не должен влиять на то, КАК я вызываю API, но для справки я использую Python / Appengine / Webapp.

Спасибо

Tom

ОБНОВЛЕНИЕ после того, как сильно ударился головой о стол, мне удалось решить эту проблему к моему удовлетворению. Это не так сложно, но я взломал код 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/ Психология История математики Математическая логика Генерал ААС Популярные математики Научный, технический и медицинский Искусство и Музыка Философия разума Амазонка математика Архитектура и логика Современная философия: 1900- логика Классика физика Метафизика Философия физики генеральный Технология Теория алгебраических чисел Искусственный интеллект История науки

http://www.amazon.co.uk/Flatland-Romance-Dimensions-Dover-Thrift/dp/048627263X/ Современная художественная литература Философия математики Генерал ААС Популярные математики философия Научный, технический и медицинский Философия разума Научная фантастика математика Современная философия: 1900- Теория алгебраических чисел Товары Классика Метафизический и дальновидный Мифы и сказки Общая топология темы генеральный Теоретические Методы Метафизика Искусственный интеллект История науки

http://www.amazon.co.uk/Victoria-Condor-Books-Knut-Hamsun/dp/0285647598/ Современная художественная литература Художественная литература психологический Генерал ААС Классика Рассказы

Ответы [ 2 ]

2 голосов
/ 09 января 2011

Моя лучшая мысль на данный момент - просто сканировать данные и сопоставлять их с жестко закодированным списком. Так что-то вроде:

если Count ("научная фантастика и фэнтези")> 3, то список научный, если Count ("бизнес финансы и право")> 3, то список бизнес

Думаю, это не плохая идея? Хватай книжные категории высшего уровня от Amazon и просто сравнивай их. Это не очень элегантно, но будет работать.

В качестве альтернативы, возможно, вы могли бы использовать данные dc: subject из Google Book API ? (Я не использовал его, хотя, возможно, это и мусор).

0 голосов
/ 03 мая 2013

гул .. Прежде всего, текущий APi датируется 2011-08-01. Может быть, вы могли бы сделать себе одолжение, посмотрев на последнюю документацию? Рекламная продукция API

Для меня XML имеет большой смысл!

Возможно, потому что, когда я хочу правильно понять один из этих ответов, я копирую XML в редактор XML Visual Studio, где я могу открывать и закрывать узлы.

Структура примерно такая:

  <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, то есть вы можете ищите то же самое, что и на amazon.Com, но также co.uk, Fr, de и т. д.), вставьте в таблицу вместе с любыми другими данными, которые вы считаете полезными, создайте таблицы для категорий, поместите туда их имена и идентификатор, затем одну таблицу ссылок с одной записью для каждого BrowseNode нижнего уровня, с BrowseNodeID и ASIN книги, а затем для вложенного browsenode (который на самом деле является родителями или предками), задают как идентификатор своего ребенка, так и свой собственный. Очевидно, что перед тем, как вставить эти категории, я бы проверил, что этого еще не существует.

Цель здесь - иметь одну запись на книгу, одну запись на категорию и столько ссылок между категориями на книги и между собой, сколько необходимо.

Таким образом, было бы чрезвычайно легко искать книги по категориям, и наоборот.

Извините, если я немного долго, но нет короткого ответа на ваш вопрос. Надеюсь, это поможет.

Bernard

...