RailsでAmazon Product Advertising APIを叩いて特定カテゴリの商品情報を取得したい | Tomoyuki Kato's Blog

RailsでAmazon Product Advertising APIを叩いて特定カテゴリの商品情報を取得したい

Engineering
この記事を書いた人

PharmaXというオンライン薬局のスタートアップで薬剤師・エンジニアとして働いています。Rails・React・TypeScriptなどを書きます。英語が得意でTOEIC900点・通訳案内士資格取得。主に薬剤師の働き方やプログラミング、英語学習について書きます。当サイトではアフィリエイトプログラムを利用して商品を紹介しています。
>> 詳しいプロフィール

Tomoyuki Katoをフォローする

 

Railsで薬学ジャンルの本の情報を取得したかったので、その時の実装メモ。

 

RailsでAmazon Product Advertising APIを叩く

APIを叩く準備としては、大きく分けて『アクセスキーの取得』と『Railsの設定』の2つがある。

 

アクセスキーの取得

まずamazonアソシエイトに登録する。

 

 

次にEメールとパスワードを入力してログインする。

 

登録が終わると以下のような画面になるので、ヘッダーの『ツール』から『Product Advertising API』をクリックする。

 

『認証情報を追加』をクリック。

 

認証情報を追加すると

  • APIアクセスキー
  • シークレットキー

を取得できるのメモしておく。

 

次にトラッキングIDを取得する。

右上から『トラッキングIDの管理』をクリック。

 

そうすると、選択中のトラッキングIDが表示されているので、IDをメモしておく。

 

これでAPIを叩くために必要なキーの取得などは終わり。

 

Railsの設定

次はRails側の設定。

まずはvacuumというgemをインスールする。

 

# Gemfile
gem 'vacuum', '~> 4.1'

 

bundle install vacuum

 

以上でAPIを叩く準備は整った。

 

Amazon Product Advertising APIで特定カテゴリの情報を取得する

 

特定のカテゴリの情報を取得するには、そのカテゴリのbrowseNodeIdを知る必要がある。

 

例えば、薬学の売れ筋本だと以下のURLに表示されている。

Amazon.co.jp 売れ筋ランキング: 薬学 の中で最も人気のある商品です
Amazon.co.jp 売れ筋ランキング: 薬学 の中で最も人気のある商品です

 

このbooksの後に続く500878という数字がbrowseNodeIdだ。

なので、取得したい商品のカテゴリーページに飛んで、各自でbrowseNodeIdを探す必要がある。

 

Amazon Product Advertising APIを叩く実装例

browseNodeIdを取得したら、以下のようにRubyで実装すればAPIを叩ける。

具体的にはAmazonTransfer.fetch_booksとターミナルで打ち込めば、本の情報を取得できるはずだ。

class AmazonTransfer
  class << self 
   REGION = 'JP'.freeze
   BROWSE_NODE_ID = '500878' 
   RESOURCES = ['BrowseNodeInfo.WebsiteSalesRank', 'ItemInfo.ByLineInfo', 'Images.Primary.Medium', 'ItemInfo.Title', 'Offers.Listings.Price'].freeze 
 
    def client
      Vacuum.new(
        marketplace: REGION,
        access_key: ENV.fetch('AWS_ACCESS_KEY_ID', nil),
        secret_key: ENV.fetch('AWS_SECRET_ACCESS_KEY', nil),
        partner_tag: ENV.fetch('PARTNER_TAG', nil)
      )
    end

    def fetch_books
      res = client.search_items(browse_node_id: BROWSE_NODE_ID, resources: RESOURCES)
      extract_book_data(res.to_h['SearchResult']['Items'])
    end

    private

    def extract_book_data(books)
      books.map do |book|
        {
          'Title' => book.dig('ItemInfo', 'Title', 'DisplayValue'),
          'Price' => book.dig('Offers', 'Listings', 0, 'Price', 'Amount'),
          'DetailPageURL' => book['DetailPageURL'],
          'Author' => extract_author(book),
          'ImageUrl' => book.dig('Images', 'Primary', 'Medium', 'URL'),
          'SalesRank' => book.dig('BrowseNodeInfo', 'WebsiteSalesRank', 'SalesRank'),
          'Publisher' => book.dig('ItemInfo', 'ByLineInfo', 'Manufacturer', 'DisplayValue')
        }
      end
    end

    def extract_author(book)
      book.dig('ItemInfo', 'ByLineInfo', 'Contributors')
          .select { |c| c['RoleType'] == 'author' }
          .map { |a| a['Name'] }
    end
  end
end

 

以下、簡単にコードの解説。

<REGIONBROWSE_NODE_ID>

Amazon APIにリクエストを送る際に使用されるパラメータ。

REGIONは日本を指定するなら”JP”でOK。

BROWSE_NODE_IDは先ほども説明した通り、取得したい情報のカテゴリのこと。

 

<RESOURCES>

取得する商品情報を表すパラメータの配列。

今回は商品のWebサイト上でのランキング、著者などのベーシックな商品情報、商品のイメージ画像、タイトル、価格などの情報を取得する。

 

Amazon Product Advertising APIのリファレンスに詳細は書いてあるので、詳しくはそちらを参照してください。

 

<clientメソッド>

Vacuumというライブラリを使用して、AmazonのAPIクライアントを作成。

アクセスキー、シークレットキー、パートナータグは環境変数から取得する。

 

<fetch_booksメソッド>

clientを使って商品データを取得し、extract_book_dataメソッドで取得したデータを加工する。

<extract_book_dataメソッド>

取得した商品データから必要な情報を抽出してハッシュとして返す。

ここでは、タイトル、価格、詳細ページURL、著者、画像URL、ランキング、出版社の情報を抽出する。

 

イメージとしては↓みたいなレスポンスが返ってくる。

[{"Title"=>"ユーキャンの登録販売者 速習テキスト&重要過去問題集 第3版【オールカラー&過去問200題収録】 (ユーキャンの資格試験シリーズ)",
  "Price"=>2310.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4426614252?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>["ユーキャン 登録販売者試験研究会"],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/61Cd14-WzmL._SL160_.jpg",
  "SalesRank"=>2827,
  "Publisher"=>"U-CAN"},
 {"Title"=>"治療薬ハンドブック2023 薬剤選択と処方のポイント",
  "Price"=>4840.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4840754519?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>[],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/41C-H97EOnL._SL160_.jpg",
  "SalesRank"=>4394,
  "Publisher"=>"じほう"},
 {"Title"=>"しくじり症例から学ぶ精神科の薬〜病棟で自信がもてる適切な薬の使い方を精神科エキスパートが教えます",
  "Price"=>3740.0,
  "DetailPageURL"=>
   "https://www.amazon.co.jp/dp/4758124043?tag=tmykkt-22&linkCode=osi&th=1&psc=1",
  "Author"=>["井上 真一郎"],
  "ImageUrl"=>"https://m.media-amazon.com/images/I/51Sbt+4OpkL._SL160_.jpg",
  "SalesRank"=>2949,
  "Publisher"=>"羊土社"}
]

 

<extract_authorメソッド>

商品データから著者の情報を抽出する

 

 

以上、おわり!

タイトルとURLをコピーしました