Development Tip

상품 리뷰를 검색하는 Amazon.com API가 있습니까?

yourdevel 2020. 10. 27. 23:32
반응형

상품 리뷰를 검색하는 Amazon.com API가 있습니까?


AWS API / 서비스 중 Amazon에서 판매 한 항목에 대한 제품 리뷰에 대한 액세스를 제공합니까? (ASIN, user_id) 튜플별로 리뷰를 찾고 싶습니다. Product Advertising API가 URL을 포함하는 페이지 (IFRAME에 삽입하기 위해)에 대한 URL을 반환하는 것을 볼 수 있지만 가능하면 리뷰 데이터의 기계 판독 가능 형식에 관심이 있습니다.


업데이트 2 :

@jpillora의 코멘트를 참조하십시오. 아마도 업데이트 1 과 관련하여 가장 관련이있을 것입니다 .

방금 Product Advertising API를 사용해 보았는데 (2014-09-17 기준)이 API는 리뷰 만 포함 된 iframe을 가리키는 URL 만 반환하는 것 같습니다. 스크린 스크래핑을해야 할 것 같네요. 아마존의 TOS를 깨뜨릴 거라고 생각합니다.

업데이트 1 :

아마도. 아래에 원래 답변을 썼습니다. 더 이상 Amazon 리뷰와 관련된 프로젝트에 참여하고 있지 않기 때문에 지금은이 내용을 살펴볼 시간이 없지만 Product Advertising API 의 웹 페이지 에는 "제품 광고 API를 사용하면 제품 검색 및 조회를 사용하여 Amazon 제품을 광고 할 수 있습니다. 기능, 제품 정보 및 기능 (예 : Customer Reviews ...) "기준 2011-12-08. 그래서 누군가가 그것을 살펴보고 여기에 다시 게시하기를 바랍니다. 이 답변을 자유롭게 편집하십시오.

실물:

아니.

다음은 이유에 대한 이론을 포함한 사실에 대한 흥미로운 포럼 토론입니다. http://forums.digitalpoint.com/showthread.php?t=1932326

내가 틀렸다면 찾은 것을 게시하십시오. 리뷰 콘텐츠를 얻고 가능한 경우 Amazon에 리뷰를 제출하는 데 관심이 있습니다.

이 링크를 확인할 수 있습니다 : http://reviewazon.com/ . 방금 우연히 발견하고 조사하지 않았지만 https : // affiliate에 게시 된 Amazon Products Advertising API의 리뷰 삭제와 관련된 업데이트에 대한 업데이트에 대한 언급이 사이트에 전혀 표시되지 않아 놀랍습니다. -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

Amazon Product Advertizing API 라이선스 계약 ( https://affiliate-program.amazon.com/gp/advertising/api/detail/agreement.html ) 에 따르면 특히 4.b.iii 지점입니다.

아마존 사이트에서 최종 사용자를 보내고 판매를 유도하기 위해 상품 광고 콘텐츠 만 사용합니다.

즉, 귀하의 사이트에서 제품을 판매하기 위해 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

도움이되기를 바랍니다.


안타깝게도 리뷰가있는 iframe URL 만 얻을 수 있으며 콘텐츠 자체에는 액세스 할 수 없습니다.

출처 : http://docs.amazonwebservices.com/AWSECommerceService/2011-08-01/DG/CHAP_MotivatingCustomerstoBuy.html#GettingCustomerReviews


위의 다른 사람들이 말했듯이 아마존은 API에서 리뷰 제공을 중단했습니다. 그러나, 나는 파이썬과 똑같이 할 수있는이 멋진 튜토리얼을 발견했습니다. 그가 제공하는 코드는 다음과 같습니다. 그는 파이썬 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()

여기, 그의 웹 사이트 리뷰에 대한 링크 는 파이썬 2.7로 스크랩입니다.


You can use Amazon Product Advertising API. It has a Response Group 'Reviews' which you can use with operation 'ItemLookup'. You need to know ASIN i.e. unique item id of the product.

Once you set all the parameters and execute the signed URL, you will receive an XML which contains a link to customer reviews under "IFrameURL" tag.

Use this URL and use pattern searching in html returned from this url to extract the reviews. For each review in the html, there will be a unique review id and under that you can get all the data for that particular review.

참고URL : https://stackoverflow.com/questions/4811259/is-there-an-amazon-com-api-to-retrieve-product-reviews

반응형