Предоставляет ли какой-либо из API / сервисов AWS доступ к обзорам продуктов, продаваемых Amazon? Мне интересно искать отзывы по кортежу (ASIN, user_id). Я вижу, что Product Advertising API возвращает URL-адрес страницы (для встраивания в IFRAME), содержащей URL-адреса, но меня интересует машиночитаемый формат данных обзора, если это возможно.
Есть ли API Amazon.com для получения обзоров продуктов?
Ответы (8)
Обновление 2:
См. Комментарий @ jpillora. Вероятно, это наиболее актуально для Обновления 1.
Я только что попробовал Product Advertising API (по состоянию на 17 сентября 2014 г.), кажется, что этот API возвращает только URL-адрес, указывающий на iframe, содержащий только обзоры. Я думаю, вам придется очистить экран - хотя я полагаю, что это нарушит TOS Amazon.
Обновление 1:
Может быть. Я написал оригинальный ответ ниже ранее. У меня нет времени разбираться в этом прямо сейчас, потому что я больше не участвую в проекте, посвященном обзорам Amazon, а их веб-страница по адресу Product Advertising API говорится:« Product Advertising API помогает вам рекламировать товары Amazon с помощью поиска и поиска товаров, информации о товарах и таких функций, как отзывы клиентов. .. »по состоянию на 08.12.2011. Так что я надеюсь, что кто-то изучит это и напишет здесь; не стесняйтесь редактировать этот ответ.
Исходный:
Неа.
Вот интересное обсуждение этого факта на форуме, включая теории о том, почему: http://forums.digitalpoint.com/showthread.php?t=1932326
Если я ошибаюсь, опубликуйте, что вы нашли. Я заинтересован в получении контента обзоров, а также в разрешении отправки отзывов в Amazon, если это возможно.
Вы можете проверить эту ссылку: http://reviewazon.com/. Я просто наткнулся на это и не изучал, но я удивлен, что не вижу упоминания на их сайте об обновлении, касающемся падения отзывов из API рекламы продуктов Amazon, размещенных по адресу: https://affiliate-program.amazon.com/gp/advertising/api/detail/main.html
Вот мой быстрый взгляд на это - вы легко можете получить сами отзывы, приложив немного больше усилий:
countries=['com','co.uk','ca','de']
books=[
'''http://www.amazon.%s/Glass-House-Climate-Millennium-ebook/dp/B005U3U69C''',
'''http://www.amazon.%s/The-Japanese-Observer-ebook/dp/B0078FMYD6''',
'''http://www.amazon.%s/Falling-Through-Water-ebook/dp/B009VJ1622''',
]
import urllib2;
for book in books:
print '-'*40
print book.split('%s/')[1]
for country in countries:
asin=book.split('/')[-1]; title=book.split('/')[3]
url='''http://www.amazon.%s/product-reviews/%s'''%(country,asin)
try: f = urllib2.urlopen(url)
except: page=""
page=f.read().lower(); print '%s=%s'%(country, page.count('member-review'))
print '-'*40
Согласно лицензионному соглашению API рекламы продуктов Amazon (https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html) и, в частности, это пункт 4.b.iii:
Вы будете использовать Контент рекламы продукта только ... для отправки конечных пользователей на сайт Amazon и увеличения продаж на нем.
Это означает, что вам запрещено показывать обзоры продуктов Amazon, полученные через их API, для продажи продуктов на вашем сайте. Разрешено только перенаправлять посетителей вашего сайта на Amazon и получать партнерские комиссии.
Я бы использовал что-то вроде ответа @mfs выше. К сожалению, его / ее ответ будет работать не более чем для 10 отзывов, поскольку это максимум, который может быть отображен на одной странице.
Вы можете рассмотреть следующий код:
import requests
nreviews_re = {'com': re.compile('\d[\d,]+(?= customer review)'),
'co.uk':re.compile('\d[\d,]+(?= customer review)'),
'de': re.compile('\d[\d\.]+(?= Kundenrezens\w\w)')}
no_reviews_re = {'com': re.compile('no customer reviews'),
'co.uk':re.compile('no customer reviews'),
'de': re.compile('Noch keine Kundenrezensionen')}
def get_number_of_reviews(asin, country='com'):
url = 'http://www.amazon.{country}/product-reviews/{asin}'.format(country=country, asin=asin)
html = requests.get(url).text
try:
return int(re.compile('\D').sub('',nreviews_re[country].search(html).group(0)))
except:
if no_reviews_re[country].search(html):
return 0
else:
return None # to distinguish from 0, and handle more cases if necessary
Запустив это с 1433524767 (который имеет значительно различающееся количество отзывов для трех интересующих стран), я получаю:
>> print get_number_of_reviews('1433524767', 'com')
3185
>> print get_number_of_reviews('1433524767', 'co.uk')
378
>> print get_number_of_reviews('1433524767', 'de')
16
Надеюсь, это поможет
Как было сказано выше, Amazon прекратил предоставлять обзоры в своем API. Тем не менее, я нашел этот хороший учебник, чтобы сделать то же самое с python. Вот код, который он дает, у меня работает! Он использует python 2.7
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Written as part of https://www.scrapehero.com/how-to-scrape-amazon-product-reviews-using-python/
from lxml import html
import json
import requests
import json,re
from dateutil import parser as dateparser
from time import sleep
def ParseReviews(asin):
#This script has only been tested with Amazon.com
amazon_url = 'http://www.amazon.com/dp/'+asin
# Add some recent user agent to prevent amazon from blocking the request
# Find some chrome user agent strings here https://udger.com/resources/ua-list/browser-detail?browser=Chrome
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'}
page = requests.get(amazon_url,headers = headers).text
parser = html.fromstring(page)
XPATH_AGGREGATE = '//span[@id="acrCustomerReviewText"]'
XPATH_REVIEW_SECTION = '//div[@id="revMHRL"]/div'
XPATH_AGGREGATE_RATING = '//table[@id="histogramTable"]//tr'
XPATH_PRODUCT_NAME = '//h1//span[@id="productTitle"]//text()'
XPATH_PRODUCT_PRICE = '//span[@id="priceblock_ourprice"]/text()'
raw_product_price = parser.xpath(XPATH_PRODUCT_PRICE)
product_price = ''.join(raw_product_price).replace(',','')
raw_product_name = parser.xpath(XPATH_PRODUCT_NAME)
product_name = ''.join(raw_product_name).strip()
total_ratings = parser.xpath(XPATH_AGGREGATE_RATING)
reviews = parser.xpath(XPATH_REVIEW_SECTION)
ratings_dict = {}
reviews_list = []
#grabing the rating section in product page
for ratings in total_ratings:
extracted_rating = ratings.xpath('./td//a//text()')
if extracted_rating:
rating_key = extracted_rating[0]
raw_raing_value = extracted_rating[1]
rating_value = raw_raing_value
if rating_key:
ratings_dict.update({rating_key:rating_value})
#Parsing individual reviews
for review in reviews:
XPATH_RATING ='./div//div//i//text()'
XPATH_REVIEW_HEADER = './div//div//span[contains(@class,"text-bold")]//text()'
XPATH_REVIEW_POSTED_DATE = './/a[contains(@href,"/profile/")]/parent::span/following-sibling::span/text()'
XPATH_REVIEW_TEXT_1 = './/div//span[@class="MHRHead"]//text()'
XPATH_REVIEW_TEXT_2 = './/div//span[@data-action="columnbalancing-showfullreview"]/@data-columnbalancing-showfullreview'
XPATH_REVIEW_COMMENTS = './/a[contains(@class,"commentStripe")]/text()'
XPATH_AUTHOR = './/a[contains(@href,"/profile/")]/parent::span//text()'
XPATH_REVIEW_TEXT_3 = './/div[contains(@id,"dpReviews")]/div/text()'
raw_review_author = review.xpath(XPATH_AUTHOR)
raw_review_rating = review.xpath(XPATH_RATING)
raw_review_header = review.xpath(XPATH_REVIEW_HEADER)
raw_review_posted_date = review.xpath(XPATH_REVIEW_POSTED_DATE)
raw_review_text1 = review.xpath(XPATH_REVIEW_TEXT_1)
raw_review_text2 = review.xpath(XPATH_REVIEW_TEXT_2)
raw_review_text3 = review.xpath(XPATH_REVIEW_TEXT_3)
author = ' '.join(' '.join(raw_review_author).split()).strip('By')
#cleaning data
review_rating = ''.join(raw_review_rating).replace('out of 5 stars','')
review_header = ' '.join(' '.join(raw_review_header).split())
review_posted_date = dateparser.parse(''.join(raw_review_posted_date)).strftime('%d %b %Y')
review_text = ' '.join(' '.join(raw_review_text1).split())
#grabbing hidden comments if present
if raw_review_text2:
json_loaded_review_data = json.loads(raw_review_text2[0])
json_loaded_review_data_text = json_loaded_review_data['rest']
cleaned_json_loaded_review_data_text = re.sub('<.*?>','',json_loaded_review_data_text)
full_review_text = review_text+cleaned_json_loaded_review_data_text
else:
full_review_text = review_text
if not raw_review_text1:
full_review_text = ' '.join(' '.join(raw_review_text3).split())
raw_review_comments = review.xpath(XPATH_REVIEW_COMMENTS)
review_comments = ''.join(raw_review_comments)
review_comments = re.sub('[A-Za-z]','',review_comments).strip()
review_dict = {
'review_comment_count':review_comments,
'review_text':full_review_text,
'review_posted_date':review_posted_date,
'review_header':review_header,
'review_rating':review_rating,
'review_author':author
}
reviews_list.append(review_dict)
data = {
'ratings':ratings_dict,
'reviews':reviews_list,
'url':amazon_url,
'price':product_price,
'name':product_name
}
return data
def ReadAsin():
#Add your own ASINs here
AsinList = ['B01ETPUQ6E','B017HW9DEW']
extracted_data = []
for asin in AsinList:
print "Downloading and processing page http://www.amazon.com/dp/"+asin
extracted_data.append(ParseReviews(asin))
sleep(5)
f=open('data.json','w')
json.dump(extracted_data,f,indent=4)
if __name__ == '__main__':
ReadAsin()
Вот ссылка на его веб-сайт. обзор обзоров с помощью python 2.7 а>
К сожалению, вы можете получить только URL-адрес iframe с отзывами, сам контент недоступен.
Инструменты мониторинга обзоров предлагают сторонние API. Одним из них является Review Monitoring API FeedCheck.
Вы можете использовать Amazon Product Advertising API. У него есть группа ответа «Обзоры», которую вы можете использовать с операцией «ItemLookup». Вам необходимо знать ASIN, т.е. уникальный идентификатор товара.
После установки всех параметров и выполнения подписанного URL-адреса вы получите XML-код, содержащий ссылку на отзывы клиентов в теге «IFrameURL».
Используйте этот URL-адрес и используйте поиск по шаблону в html, возвращенный с этого URL-адреса, для извлечения отзывов. Для каждого обзора в html будет уникальный идентификатор обзора, под которым вы можете получить все данные для этого конкретного обзора.