У меня есть веб-сайт (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/
Современная художественная литература
Художественная литература
психологический
Генерал ААС
Классика
Рассказы