36
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

【Python】AmazonのPA-API 5.0でAmazonの商品情報をとる方法

はじめに

Amazon PA-API(Product Advertising API)が2019年12月からバージョン4.0から5.0へと一新したためスクリプトもバージョン5.0用に組み直しました.(組み直す必要がありました)

開発環境

  • macOS Mojave 10.14.4
  • Python3.7

事前に準備するもの

Amazon出品者アカウントを作成後,こちらから

Access Key
Secret Key
Partner Tag

を取得してください.

pipコマンド等でamazon-paapi5をインストールしてください.

Scratchpad

PA-API5.0の仕様はこちらで確認できます.Scratchpadを使えば,上記で指定した3つのKEYと入力パラメータとそのバリューをテキストボックスにいれこむだけで簡単にAPIを叩くことができます.そのとき実際に生成されるAPIリクエストとそれに対するJSONレスポンスを一緒に確認できます.またPythonやPHPなどのサンプルリクエストコードも提示してくれます.非常に使いやすいのでコード書き始める前に一度こちらを試して見るのをお勧めします.

サンプルコード

サンプル1

入力 出力
検索ワード ASIN
商品価格
商品URL
商品タイトル

JANコード検索ワードにすることもできます.

from amazon.paapi import AmazonAPI

KEY    = "<INPUT YOUR KEY>"
SECRET = "<INPUT YOUR SECRET KEY>"
TAG    = "<INPUT YOUR PARTNER TAG>"
COUNTRY = "JP"
keyword = "任天堂Switch"

amazon = AmazonAPI(KEY, SECRET, TAG, COUNTRY)

products = amazon.search_items(keywords=keyword)
asin     = products["data"][0].asin
price    = products["data"][0].offers.listings[0].price.amount
url      = products["data"][0].detail_page_url
title    = products["data"][0].item_info.title.display_value

print(asin, price, url, title)

サンプル2

入力 出力
ASIN ASIN
商品価格
JANコード
商品URL
商品タイトル

.get_items()メソッドは一度のリクエストで最大10ものASINを入力にAPIレスポンスを得られます.


#coding:utf-8
from amazon.paapi import AmazonAPI

KEY    = "<INPUT YOUR KEY>"
SECRET = "<INPUT YOUR SECRET KEY>"
TAG    = "<INPUT YOUR PARTNER TAG>"
COUNTRY = "JP"
asin_list = ["B087QZ1FWZ","B087QW57NZ","B081T9VJS4","B087QZGN24"]#一度に叩けるのは最大10個

amazon = AmazonAPI(KEY, SECRET, TAG, COUNTRY)

products = amazon.get_items(item_id_type="ASIN", item_ids=asin_list)
    #各ASINに紐付く情報を取りだす
    for asin in asin_list:
        try:
            asin  = products["data"][asin].asin
            price = int(products["data"][asin].offers.listings[0].price.amount)
            jan   = products["data"][asin].item_info.external_ids.ea_ns.display_values[0]
            url   = products["data"][asin].detail_page_url
            title = products["data"][asin].item_info.title.display_value
            print(asin, price, jan, url, title)

        except:
            None

以下のようなasin.txtを入力としたバージョンがこちら

asin.txt
B087QZ1FWZ
B087QW57NZ
B081T9VJS4
B087QZGN24
B081T9Z4KG
B084XH5NW1
B07YNPWP5M
B086ZGFKPR
B086ZFTHY2
B084DF682G
B07QWR3KDW
B07MR6YMXC
B081T9MCG7
B084HPJWK9
B087D2NW77
#coding:utf-8
from amazon.paapi import AmazonAPI
from time import sleep

KEY    = "<INPUT YOUR KEY>"
SECRET = "<INPUT YOUR SECRET KEY>"
TAG    = "<INPUT YOUR PARTNER TAG>"
COUNTRY = "JP"
amazon = AmazonAPI(KEY, SECRET, TAG, COUNTRY)

def send_request(asin,b):
    products = amazon.get_items(item_id_type="ASIN", item_ids=asin_list)
    num = 0
    for asin in asin_list:
        try:
            num += 1
            asin  = products["data"][asin].asin
            price = products["data"][asin].offers.listings[0].price.amount
            jan   = products["data"][asin].item_info.external_ids.ea_ns.display_values[0]
            url         = products["data"][asin].detail_page_url
            monourl     = "https://mnrate.com/item/aid/"+asin
            title       = products["data"][asin].item_info.title.display_value
            print (asin, jan, price)
            b.write(asin+","+jan+","+title+","+price+","+url+","+monourl+"\n")
            sleep(0.1)
        except:
            None

#何回のAPIリクエストが必要になるかの計算
pages = sum([1 for _ in open('asin.txt')])/10 + 1
a = open("asin.txt","r")#入力ファイル
b = open("jan.csv","w")#出力ファイル
asin_list = []
num = 0

for i in a:
    num += 1
    asin = i.rstrip()
    asin_list.append(asin)

    #ASINリストの長さが10になったらAPIを叩く
    if len(asin_list) == 10:
        send_request(asin_list,b)
        asin_list = []

    #一番最後のリクエスト
    elif num == pages:
        send_request(asin_list,b)

a.close()
b.close()

monourl はモノレートページのURLで商品の売れ筋具合の確認が可能です.ちなみにこのコードはせどり用に作ったモノです.

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
36
Help us understand the problem. What are the problem?