Amazon では商品の検索、商品の詳細情報を API で提供しています。
欲しい情報を指定した URL クエリを投げると、
xml 形式で情報を返してくれます。
この API は https による通信にも対応しているのですが、
クエリを作る際に電子署名を付けるなど、
少々面倒な手順があるのですが、
手順さえ守ればちゃんと利用できます。
ここでは、R で Amazon API を使って商品情報を取得してみます。
準備
Amazon API を利用するためには、
Amazon アソシエイトのアカウントの作成と、
認証キーの生成 の二つが必要になります。
Amazon アソシエイトのアカウントの作成
Amazon アソシエイトとは Amazon の商品を紹介することで、
紹介した商品が購入された際に数パーセントの紹介料を得るサービスですが、
Amazon API はこの商品紹介に必要な情報を提供する位置づけになります。
そのため、まずは、Amazon アソシエイトのアカウントを作成することが必要になります。
下のリンクから、画面の案内に従ってアカウントを作成すると、
アソシエイトID「~~~~~~-22」が発行されるので覚えておきましょう。
認証キーの生成
続いて、API を利用する際の認証キー生成します。
下記の URL にアクセスし、
https://affiliate.amazon.co.jp/assoc_credentials/home
「認証情報を追加する」をクリックします。
このとき、「アクセスキー」と「シークレットキー」が表示されるので、
確実に保管しておきましょう。
R で Amazon API を利用
上の手順で、「アソシエイトID」「アクセスキー」「シークレットキー」が揃えば、
API を利用する準備が整ったので、さっそく API を使ってみましょう。
利用するパッケージ
API を利用する上で電子署名が必要になるので、
digest
パッケージを利用します。
また、API は URL でリクエストを送るので、
rvest
パッケージも利用しています。
library(rvest) library(digest)
変数の設定
取得した、「アソシエイトID」「アクセスキー」「シークレットキー」を、
変数に格納しておきます。
#### user define AMAZON_ASSOCIATE = "アソシエイトID" AMAZON_API_KEY = "アクセスキー" AMAZON_API_SEC = "シークレットキー" #### AMAZON_API_END = "webservices.amazon.co.jp" AMAZON_API_URI = "/onca/xml"
AMAZON_API_END
は API のエンドポイントで、
国ごとに異なりますが、日本の場合は上記の通りです。
クエリを生成して結果を取得する関数
それでは、クエリを生成して、結果を取得する手順を関数にまとめておきます。
下の関数では、クエリのパラメータのリストを受け取って、
署名等必要な操作を行ってクエリを生成し、結果を取得します。
amazon_api_query = function(params){ if(is.null(params$Service)){ params$Service = "AWSECommerceService" } if(is.null(params$AWSAccessKeyId)){ params$AWSAccessKeyId=AMAZON_API_KEY } if(is.null(params$AssociateTag)){ params$AssociateTag=AMAZON_ASSOCIATE } if(is.null(params$Timestamp)){ params$Timestamp = format(Sys.time(),"%Y-%m-%dT%H:%M:%S.000Z", tz="UTC") } params = params[order(names(params))] buf = NULL for(k in names(params)){ buf=rbind(buf,paste(URLencode(k,T,T),URLencode(params[[k]],T,T),sep = "=")) } query = paste(buf,collapse = "&") string_to_sign = paste("GET",AMAZON_API_END,AMAZON_API_URI,query,sep="\n") signature = base64enc::base64encode(hmac(AMAZON_API_SEC,string_to_sign,algo = "sha256",raw = T)) q_url = paste("https://",AMAZON_API_END,AMAZON_API_URI,"?",query,"&Signature=",URLencode(signature,T,T),sep="") read_html(q_url) }
上の関数を使うと、パラメータを指定するだけで、
好きな情報を取得することができます。
パラメータについては、
Amazon の API ドキュメントを参照しましょう。
実行例
それでは実際に、API から情報を取得してみましょう。
商品の検索で、衣服のジャンルで「Shirt」というキーワードでの検索結果を取得します。
params = list( Operation = "ItemSearch", Keywords = "Shirt", SearchIndex = "Apparel" ) page = amazon_api_query(params)
結果は、xml形式 で返ってくるため、
好きな要素を取得しましょう。
たとえば、検索結果の中から商品のID (ASIN)を取得するには、
page %>% html_nodes(xpath="//item/asin") %>% html_text()
とすれば、ID のリストが得られます。