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


#はじめに
[Amazon PA-API](https://webservices.amazon.com/paapi5/documentation/)(Product Advertising API)が2019年12月からバージョン4.0から5.0へと一新したためスクリプトもバージョン5.0用に組み直しました．(組み直す必要がありました)

#開発環境
- macOS Mojave 10.14.4
- Python3.7

#事前に準備するもの
Amazon出品者アカウントを作成後，[こちら](https://webservices.amazon.com/paapi5/documentation/register-for-pa-api.html)から

```Access Key```
```Secret Key```
```Partner Tag```

を取得してください．

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


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

#サンプルコード
サンプル1

|入力|出力|
|---|---|
|検索ワード|ASIN<br>商品価格<br>商品URL<br>商品タイトル|
JANコード検索ワードにすることもできます．

```python:
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<br>商品価格<br>JANコード<br>商品URL<br>商品タイトル|

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


```python

#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
```

```python:
#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で商品の売れ筋具合の確認が可能です．ちなみにこのコードはせどり用に作ったモノです．