chakokuのブログ(rev4)

日々のごった煮ブログです

BigDataとしてのAmazon

BigDataの手法を使って価値のある情報を得るには、望む情報を内在する大量データが必要。そして、抽出したい情報の仕様も必要。さらに、、分析前の大量データが結果を出すのに相応しいのか、また、分析手法が妥当か?も課題である。
国内統計データとか政府が公開しているデータで分析する事例もあるようだけど、、国勢調査の結果とか自分はあまり興味がわかない。そんな中、しょっちゅう利用しているAmazonサイト自体をBigDataとして分析したらどうか?と思った*1。少なくとも自分は、Kindleの無料コミックページを毎週読んでいて、★4つ以上で、無料で、未読のコミックだけを購入して(0円で購入)読んでいる。既読のコミックと新作コミック(0円)を目で見て分類するのだけど、これが結構時間かかる。しかも、、昔に0円で読んだコミックが、一旦有料になって、再度0円になって、Amazonでは「新作」ラベルが付いたりして紛らわしい。
そんな中、if(Kindle無料コミック&&既読除外&&評価が★4つ)とか、そういう条件でコミック一覧が出せたら結構便利。AmazonKindleページをPython等でスクレイピングする方法もあるけど、ここはひとつAmazonが提供するAPI(Amazon Product Advertising API)を使って、自分の読みたい新作無料マンガ本を検索できるようにしてみたい(昔読んだのは省いてくれる機能付き)。

■追記
APIツールを使って商品情報を取得するサンプル

#!/usr/bin/python
from amazon.api import AmazonAPI

AMAZON_ACCESS_KEY = 'xxxxxxxxxxxxxxx'
AMAZON_SECRET_KEY = 'xxxxxxxxxxxxxxx'
AMAZON_ASSOC_TAG = 'xxxxxxxxxxxxxxxx'

amazon = AmazonAPI(AMAZON_ACCESS_KEY, AMAZON_SECRET_KEY, AMAZON_ASSOC_TAG,region="JP")
id='4873110637'   # C++プログラミング入門 (ISBN-10: 4873110637)
product = amazon.lookup(ItemId=id)

import inspect
print inspect.getmembers(product)

■ご参考URL
ぱんぶろ様、「「Amazon API」の使い方を紹介します」
https://www.panzee.biz/archives/6222
Amazon::Product Advertising API
https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html
Amazon Product APIPythonで叩く簡単な方法
http://qiita.com/zabeth129/items/00d69d451a16ea3e714a
Pythonで書かれたAPIを叩くツール
https://github.com/yoavaviram/python-amazon-simple-product-api

RESTでAPIを叩く際の署名作成手順
https://images-na.ssl-images-amazon.com/images/G/09/associates/paapi/dg/index.html?Query_QueryAuth.html

■追記
基本的なライブラリだけでAmazon Produce APIを叩く例

#!/usr/bin/python

import urllib2
import hashlib, hmac
import base64
import time


HTTPVerb = 'GET'
AMAZON_FQDN = 'ecs.amazonaws.jp'
REQUEST_URI = '/onca/xml'
AMAZON_URL = 'http://' + AMAZON_FQDN + REQUEST_URI

AMAZON_ACCESS_KEY = 'AKIAIZ5PZPNPJADUK6IQ'
AMAZON_SECRET_KEY = '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'
AMAZON_ASSOC_TAG = 'dunesakurnejp-22'
    
params = {
  "Operation" : "ItemLookup",
  "ItemId" : '4873110637',    # books of C++ 
  "Service" : "AWSECommerceService",
  "AWSAccessKeyId" : xxxxxxxxxxxxxx,
  "AssociateTag" :  xxxxxxxxxxxxx,
  "Timestamp" : time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())}

params = sorted(params.items())
        
request = []
for (aKey,aVal) in params:
       request.append("%s=%s" % (aKey, urllib2.quote(aVal.encode("utf-8"))))

sign = HTTPVerb + "\n" + AMAZON_FQDN + "\n" + REQUEST_URI + "\n" + '&'.join(request)
digest = hmac.new(AMAZON_SECRET_KEY, sign, hashlib.sha256).digest()
signature = urllib2.quote(base64.b64encode(digest))
        
request.append("Signature=%s" % signature)
rest_url = AMAZON_URL + '?' + '&'.join(request)
opener = urllib2.build_opener()
ret = opener.open(rest_url).read()

from xml.dom.minidom import parseString
print parseString(ret).toprettyxml(encoding="sjis")

実行結果

<?xml version="1.0" encoding="sjis"?>
<ItemLookupResponse xmlns="http://webservices.amazon.com/AWSECommerceService/2011-08-01">
        <OperationRequest>
                <HTTPHeaders>
                        <Header Name="UserAgent" Value="Python-urllib/2.7"/>
                </HTTPHeaders>
                <RequestId>dba9d1ed-67ad-46bf-9e43-e09f4c2c77d7</RequestId>
                <Arguments>
                        <Argument Name="AWSAccessKeyId" Value="AKIAIZ5XXXXXXXXXxK6IQ"/>
                        <Argument Name="AssociateTag" Value="duneXXXXXXXXXXXX22"/>
                        <Argument Name="ItemId" Value="4873110637"/>
                        <Argument Name="Operation" Value="ItemLookup"/>
                        <Argument Name="Service" Value="AWSECommerceService"/>
                        <Argument Name="Timestamp" Value="2017-04-23T07:59:00Z"/>
                        <Argument Name="Signature" Value="ivDU20vm6xAw31KJtcRheoMEL22fTZR3F759UttNdo4="/>
                </Arguments>
                <RequestProcessingTime>0.0050621220000000</RequestProcessingTime>
        </OperationRequest>
        <Items>
                <Request>
                        <IsValid>True</IsValid>
                        <ItemLookupRequest>
                                <IdType>ASIN</IdType>
                                <ItemId>4873110637</ItemId>
                                <ResponseGroup>Small</ResponseGroup>
                                <VariationPage>All</VariationPage>
                        </ItemLookupRequest>
                </Request>
                <Item>
                        <ASIN>4873110637</ASIN>
                        <DetailPageURL>https://www.amazon.co.jp/C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E3%82%B0%E3%83%AC%E3%82%B4%E3%83%AA%E3%83%BC-%E3%82%B5%E3%83%86%E3%82%A3%E3%82%A2/dp/4873110637?SubscriptionId=AKIAIZ5PZPNPJADUK6IQ&amp;tag=dunesakurnejp-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=165953&amp;creativeASIN=4873110637</DetailPageURL>
                        <ItemLinks>
                                <ItemLink>
                                        <Description>Add To Wishlist</Description>
                                        <URL>https://www.amazon.co.jp/gp/registry/wishlist/add-item.html?asin.0=4873110637&amp;SubscriptionId=AKIAIZ5PZPNPJADUK6IQ&amp;tag=dunesakurnejp-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=5143&amp;creativeASIN=4873110637</URL>
                                </ItemLink>
                                <ItemLink>
                                        <Description>Tell A Friend</Description>
                                        <URL>https://www.amazon.co.jp/gp/pdp/taf/4873110637?SubscriptionId=AKIAIZ5PZPNPJADUK6IQ&amp;tag=dunesakurnejp-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=5143&amp;creativeASIN=4873110637</URL>
                                </ItemLink>
                                <ItemLink>
                                        <Description>All Customer Reviews</Description>
                                        <URL>https://www.amazon.co.jp/review/product/4873110637?SubscriptionId=AKIAIZ5PZPNPJADUK6IQ&amp;tag=dunesakurnejp-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=5143&amp;creativeASIN=4873110637</URL>
                                </ItemLink>
                                <ItemLink>
                                        <Description>All Offers</Description>
                                        <URL>https://www.amazon.co.jp/gp/offer-listing/4873110637?SubscriptionId=AKIAIZ5PZPNPJADUK6IQ&amp;tag=dunesakurnejp-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=5143&amp;creativeASIN=4873110637</URL>
                                </ItemLink>
                        </ItemLinks>
                        <ItemAttributes>
                                <Author>グレゴリー サティア</Author>
                                <Author>ダウグ ブラウン</Author>
                                <Creator Role="原著">Gregory Satir</Creator>
                                <Creator Role="原著">Doug Brown</Creator>
                                <Creator Role="翻訳">望月 康司</Creator>
                                <Creator Role="翻訳">谷口 功</Creator>
                                <Manufacturer>オライリー・ジャパン</Manufacturer>
                                <ProductGroup>Book</ProductGroup>
                                <Title>C++プログラミング入門</Title>
                        </ItemAttributes>
                </Item>
        </Items>
</ItemLookupResponse>

下記「人工知能に関する断創録」様の記事を参考に一部改変しました。
http://aidiary.hatenablog.com/entry/20100116/1263647145
PythonAmazon Product Advertising APIを使う」

*1:言うまでもないがAmazonは大量の販売情報を分析して経営戦略に活用してる。で、、その分析結果に基づき構築されているAmazonサイトを俺BigData分析するという、、何とも言えない階層なんだが。。アホ道を歩め!としては、なかなかアホな感じでいいかも。ちょっとまじめに言うと、Amazonトレンドウオッチャーとかそんなのかも