こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!
- Amazonでの商品リサーチを効率化したい
- Amazon SP-APIを操作できるPythonプログラミング手法が知りたい
- Amazon SP-APIによる「商品検索」と「データ取得方法」が知りたい
Amazon セリングパートナーAPI(SP-API)とは
Amazon SP-API(セリングパートナーAPI)とは、Amazonのセリングパートナー向けに、商品リサーチ・出品・注文対応・配送・その他会計管理などの機能を多数揃えた、業務効率化・自動化を実現するためのWebサービスです。
Amazon SP-APIでできること|取得できるデータ
Amazon SP-APIを用いることで商品リサーチの自動化をはじめ、出品・注文・配送・売上情報のレポーティングなどAmazonサプライチェーン全体での業務効率化を実現できます。
具体的にSP-APIには次のような機能が踏襲されています。
- Amazon商品データ(商品詳細・価格・在庫・売上ランキング)の取得
- 商品販売にかかる手数料計算
- 商品の出品状況の管理(商品登録・参照・更新・削除)
- 商品の注文状況の管理
- FBA配送に対する適格性(禁止・規制品)データの取得
- 会計(商品売上等)データの取得・レポーティング
- 顧客との問い合わせ・メッセージの管理
- 通知情報の管理
Amazon SP-APIを利用するための条件
Amazon SP-APIは、Amazon開発者として登録することで利用できるようになります。開発者登録の条件として以下を満たす必要があることに注意が必要です。
- Amazonセラーセントラルのアカウントを保有していること
- 上記アカウントステータスが「大口出品」であること
【参考】物販業務を効率化する代替手段
前述で述べた通り、Amazon SP-APIを利用するにはAmazonセラーセントラルの大口出品者としてをアカウントを登録する必要があります。
加えて、大口出品者になるには月々4,900円の支払いが発生することに注意が必要です。
SP-APIを利用しない代替手段として、既存のツールを用いて物販自動化を検討する方法もあります。筆者おすすめの使い勝手が良い既存ツールも合わせて紹介します。
こんな方におすすめ!
- オンラインショッピングにおける販路を拡大したい
- 商品リサーチに時間をかけたくない
- 中国輸入やOEMに興味がある
- 競合他社を効率的に分析したい
- 自社ショップの商品売上等の時系列分析をやりたい
本記事で紹介する内容
本記事ではPythonとAmazon SP-APIを用いて下記を実現するプログラミング手法を解説します。
【事前準備】Python×Amazon SP-API
Amazon SP-APIを利用するには以下のPythonライブラリを事前にインストールする必要があります。
pip install python-amazon-sp-api
後述で紹介するプログラミングコードの実行には、API情報の紐付けが必須です。下記credentials
内に示すAPI情報を事前に入力し、Pythonスクリプト先頭にこのコードを貼り付けておきましょう。
credentials=dict(
refresh_token = 'リフレッシュトークン', # Amazon Seller開発者登録後に入手可能
lwa_app_id = 'クライアントID', # Amazon Seller開発者登録後に入手可能
lwa_client_secret = 'クライアント機密情報', # Amazon Seller開発者登録後に入手可能
aws_access_key = 'AWS アクセスキー', #(AWS IAMユーザーロール登録時に取得可能)
aws_secret_key = 'AWS シークレットキー', #(AWS IAMユーザーロール登録時に取得可能)
role_arn = 'AWS IAM ARN', #(AWS IAMユーザーロール登録時に取得可能)
)
【実践】Amazon SP-API|商品データを抽出
実際にPythonとAmazonセリングパートナーAPI(SP-API)を用いて商品情報を参照する方法を解説します。
以下「商品情報を取得するためのコード」と「コード実行後のアウトプットイメージ」をそれぞれ示します。
ASINコードをもとに単一商品情報を取得
検索条件に「ASINコード」を指定し、商品情報を取得する場合は、次のように記載します。
from sp_api.api import Catalog
from sp_api.base.marketplaces import Marketplaces
# 関数
def search_product(ASIN):
# 商品検索用オブジェクト
obj = Catalog(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# ASINコードを指定し商品情報取得
result = obj.get_item(ASIN)
return result()
アメリカなど海外のAmazonマーケットプレイスで商品検索・データ収集したい場合は、
上記のmarketplace=Marketplaces.JP
をmarketplace=Marketplaces.US
に変更します。
ただし、海外Amazonマーケットプレイスでの商品検索には、その国でのAmazon開発者登録が別途必要です。
# 検索条件(ASINコード)
ASIN = "B07WXL5YPW"
# 関数実行
search_product(ASIN)
# 出力イメージ
# {'Identifiers': {'MarketplaceASIN': {'MarketplaceId': 'A1VC38T7YXB528',
# 'ASIN': 'B07WXL5YPW'}},
# 'AttributeSets': [{'Platform': ['Nintendo Switch'],
# 'Binding': 'Video Game',
# 'Brand': '任天堂',
# 'Color': 'ネオンブルー/ネオンレッド',
# 'ItemDimensions': {'Height': {'value': 5.905511805, 'Units': 'inches'},
# 'Length': {'value': 11.81102361, 'Units': 'inches'},
# 'Width': {'value': 11.81102361, 'Units': 'inches'},
# 'Weight': {'value': 3.3289801562, 'Units': 'pounds'}},
# 'IsAdultProduct': False,
# 'Label': '任天堂',
# 'ListPrice': {'Amount': 32978.0, 'CurrencyCode': 'JPY'},
# 'Manufacturer': '任天堂',
# 'PackageDimensions': {'Height': {'value': 3.7795275552, 'Units': 'inches'},
# 'Length': {'value': 13.779527545, 'Units': 'inches'},
# 'Width': {'value': 7.7952755826, 'Units': 'inches'},
# 'Weight': {'value': 3.3951188348, 'Units': 'pounds'}},
# 'PackageQuantity': 1,
# 'PartNumber': '2200630056066',
# 'ProductGroup': 'Video Games',
# 'ProductTypeName': 'ABIS_VIDEO_GAMES',
# 'Publisher': '任天堂',
# 'ReleaseDate': '2019-08-30',
# 'Size': '本体のみ',
# 'SmallImage': {'URL': 'https://m.media-amazon.com/images/I/41uat+d45gL._SL75_.jpg',
# 'Height': {'Units': 'pixels', 'value': 49},
# 'Width': {'Units': 'pixels', 'value': 75}},
# 'Studio': '任天堂',
# 'Title': 'Nintendo Switch 本体 (ニンテンドースイッチ) Joy-Con(L) ネオンブルー/(R) ネオンレッド'}],
# 'Relationships': [{'Identifiers': {'MarketplaceASIN': {'MarketplaceId': 'A1VC38T7YXB528',
# 'ASIN': 'B08NDDJJ35'}}}],
# 'SalesRankings': [{'ProductCategoryId': 'video_games_display_on_website',
# 'Rank': 11},
# {'ProductCategoryId': '4731379051', 'Rank': 1}]}
ASINコードをもとに単一商品情報を取得(別解)
前述同様、検索条件に「ASINコード」を指定し、商品情報を取得する場合は、次のような記載も可能です。
前述のコードとの違いはアウトプットされる情報です。
from sp_api.api import CatalogItems
from sp_api.base.marketplaces import Marketplaces
# 関数
def search_product(ASIN):
# 商品検索用オブジェクト
obj = CatalogItems(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# ASINコードを指定し商品情報取得
result = obj.get_catalog_item(ASIN)
return result()
# 検索条件(ASINコード)
ASIN = "B07WXL5YPW"
# 関数実行
search_product(ASIN)
# 出力イメージ
# {'asin': 'B07WXL5YPW',
# 'summaries': [{'marketplaceId': 'A1VC38T7YXB528',
# 'brandName': '任天堂',
# 'browseNode': '4731379051',
# 'colorName': 'ネオンブルー/ネオンレッド',
# 'itemName': 'Nintendo Switch 本体 (ニンテンドースイッチ) Joy-Con(L) ネオンブルー/(R) ネオンレッド',
# 'manufacturer': '任天堂',
# 'sizeName': '本体のみ'}]}
ASINコード・SKUをもとに商品カテゴリ情報を取得
検索条件に「ASINコード」または「SKU(商品管理番号)」を指定し、商品のカテゴリデータを取得する場合は、次のように記載します。検索条件はどちらか片方を指定すれば問題なく動作します。
from sp_api.api import Catalog
from sp_api.base.marketplaces import Marketplaces
# 関数
def search_product_category(ASIN,SellerSKU):
# 商品検索用オブジェクト
obj = Catalog(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# ASINコードを指定し商品カテゴリ情報を取得
result = obj.list_categories(ASIN=ASIN,SellerSKU=SellerSKU)
return result()
# 検索条件
ASIN = "B07WXL5YPW" # ASINコード
SellerSKU = None # 商品管理番号
# 関数実行
search_product_category(ASIN,SellerSKU)
# 出力イメージ
# [{'ProductCategoryId': '4731379051',
# 'ProductCategoryName': 'ゲーム機本体',
# 'parent': {'ProductCategoryId': '4731377051',
# 'ProductCategoryName': 'Nintendo Switch',
# 'parent': {'ProductCategoryId': '637872',
# 'ProductCategoryName': '機種別',
# 'parent': {'ProductCategoryId': '637394', 'ProductCategoryName': 'ゲーム'}}}}]
検索キーワード・ブランド名・商品カテゴリを指定し複数の商品データ取得
検索条件に「商品キーワード」「ブランド名」「カタログID」を指定し、複数の商品一覧データを取得する場合は、次のように記載します。検索条件は「商品キーワード」の指定が必須であり、それ以外の条件は任意です。
from sp_api.api import CatalogItems
from sp_api.base.marketplaces import Marketplaces
# 関数
def search_products(keyword,searchVolume,brandName,categoryID):
# 商品検索用オブジェクト
obj = CatalogItems(marketplace=Marketplaces.JP, # 対象のマーケットプレイスを指定
credentials=credentials) # API情報を指定
# 商品を複数検索
result = obj.search_catalog_items(keywords=keyword,
pageSize=pageVolume,
brandNames=brandName,
classificationIds=categoryID)
return result()
実行結果に対して、下記のように['items']
と指定すると、検索結果(商品基本情報)が確認できます。
# 検索条件
keyword = "Switch ゲーム" # 検索キーワード
brandName = None # ブランド名
categoryID = None # 商品のカテゴリID
pageVolume = 2 # 検索件数(ページ単位)
# 検索実行
products_info = search_products(keyword,pageVolume,brandName,categoryID)
products_info['items']
# 出力イメージ
# [{'asin': 'B09N8LB9KH',
# 'summaries': [{'marketplaceId': 'A1VC38T7YXB528',
# 'brandName': '任天堂switch',
# 'browseNode': '4731379051',
# 'itemName': 'Nintendo 任天堂 Switch(有机EL款) Joy-Con(L)/(R) 白色',
# 'manufacturer': 'N\\C'}]},
# {'asin': 'B081JGS3LC',
# 'summaries': [{'marketplaceId': 'A1VC38T7YXB528',
# 'brandName': 'Amazonベーシック(Amazon Basics)',
# 'itemName': 'Amazonベーシック Nintendo Switch ゲームソフト ゲームカード収納ケース 24点収納可 9×9×3cm',
# 'manufacturer': 'Amazonベーシック(Amazon Basics)'}]}]
実行結果に対して["refinements"]["brands"]
と指定すると、検索結果(ブランド情報)が確認できます。
# 検索条件
keyword = "Switch ゲーム" # 検索キーワード
brandName = None # ブランド名
categoryID = None # 商品のカテゴリID
pageVolume = 2 # 検索件数(ページ単位)
# 検索実行
products_info = search_products(keyword,pageVolume,brandName,categoryID)
products_info["refinements"]["brands"]
# 出力イメージ
# [{'numberOfResults': 33182, 'brandName': 'スマコレ'},
# {'numberOfResults': 3581, 'brandName': 'GINJOJO'},
# {'numberOfResults': 2562, 'brandName': 'Disyoya'},
# {'numberOfResults': 2559, 'brandName': 'HAISION'},
# {'numberOfResults': 2384, 'brandName': 'zarker'},
# {'numberOfResults': 2333, 'brandName': 'DANESI'},
# {'numberOfResults': 2302, 'brandName': 'OrdnAry'},
# {'numberOfResults': 2175, 'brandName': 'LANKEWEI'},
# {'numberOfResults': 2117, 'brandName': 'PANMAX'},
# {'numberOfResults': 1970, 'brandName': 'igsticker'}]
実行結果に対して["refinements"]["classifications"]
と指定すると、検索結果(商品カテゴリ)が確認できます。
# 検索条件
keyword = "Switch ゲーム" # 検索キーワード
brandName = None # ブランド名
categoryID = None # 商品のカテゴリID
pageVolume = 2 # 検索件数(ページ単位)
# 検索実行
products_info = search_products(keyword,pageVolume,brandName,categoryID)
products_info["refinements"]["classifications"]
# 出力イメージ
# [{'numberOfResults': 127337,
# 'displayName': 'ゲーム',
# 'classificationId': '637872'},
# {'numberOfResults': 30647,
# 'displayName': 'パソコン・周辺機器',
# 'classificationId': '2127210051'},
# {'numberOfResults': 17783,
# 'displayName': '家電&カメラ',
# 'classificationId': '3210991'},
# {'numberOfResults': 7100,
# 'displayName': 'ホーム&キッチン',
# 'classificationId': '3839151'},
# {'numberOfResults': 3069,
# 'displayName': '産業・研究開発用品',
# 'classificationId': '3445394051'},
# {'numberOfResults': 1965,
# 'displayName': 'DIY・工具・ガーデン',
# 'classificationId': '2016930051'},
# {'numberOfResults': 1878,
# 'displayName': '文房具・オフィス用品',
# 'classificationId': '86732051'},
# {'numberOfResults': 1662,
# 'displayName': 'ファッション',
# 'classificationId': '2229203051'},
# {'numberOfResults': 1387,
# 'displayName': '車&バイク',
# 'classificationId': '2017305051'},
# {'numberOfResults': 1385,
# 'displayName': 'おもちゃ',
# 'classificationId': '13299551'}]
【参考】Amazon SP-API その他機能の使い方
最後までご覧いただきありがとうございました。当サイトではAmazon物販の効率化に向けたAPI情報を多数配信しております。是非合わせてご覧下さい。
最後に
お問い合わせフォーム
上記課題に向けてご気軽にご相談下さい。
お問い合わせはこちら