クイックノート

ちょっとした発見・アイデアから知識の発掘を

【R】Amazon API を使って商品情報を取得する(https)

Amazon では商品の検索、商品の詳細情報を API で提供しています。

欲しい情報を指定した URL クエリを投げると、
xml 形式で情報を返してくれます。

この APIhttps による通信にも対応しているのですが、
クエリを作る際に電子署名を付けるなど、
少々面倒な手順があるのですが、
手順さえ守ればちゃんと利用できます。

ここでは、R で Amazon API を使って商品情報を取得してみます。

準備

Amazon API を利用するためには、
Amazon アソシエイトのアカウントの作成と、
認証キーの生成 の二つが必要になります。

Amazon アソシエイトのアカウントの作成

Amazon アソシエイトとは Amazon の商品を紹介することで、
紹介した商品が購入された際に数パーセントの紹介料を得るサービスですが、
Amazon API はこの商品紹介に必要な情報を提供する位置づけになります。

そのため、まずは、Amazon アソシエイトのアカウントを作成することが必要になります。

下のリンクから、画面の案内に従ってアカウントを作成すると、
アソシエイトID「~~~~~~-22」が発行されるので覚えておきましょう。

affiliate.amazon.co.jp

認証キーの生成

続いて、API を利用する際の認証キー生成します。

下記の URL にアクセスし、
https://affiliate.amazon.co.jp/assoc_credentials/home

「認証情報を追加する」をクリックします。
f:id:u874072e:20180818085704p:plain:w300

このとき、「アクセスキー」「シークレットキー」が表示されるので、
確実に保管しておきましょう。

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_ENDAPI のエンドポイントで、
国ごとに異なりますが、日本の場合は上記の通りです。

クエリを生成して結果を取得する関数

それでは、クエリを生成して、結果を取得する手順を関数にまとめておきます。

下の関数では、クエリのパラメータのリストを受け取って、
署名等必要な操作を行ってクエリを生成し、結果を取得します。

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 のリストが得られます。

プライバシーポリシー