【Python】サクッとAmazonの商品情報を検索してみる


はじめに

AmazonProductAdvertisingAPIのItemSearchを使ってAmazonの商品情報を検索します。
APIを利用するにはアカウントの登録が必要ですので、まだ持ってない場合は下記を参考に。
Amazon Web サービス入門(Product Advertising API)

使用するライブラリ

API用のライブラリはbottlenoseを使用します。

$ pip install bottlenose

他にもpython-amazon-product-apiなどありますが、上記がシンプルで一番使いやすかったです。他のは商品情報を取得した後にエラーになったりと、よくわからない状態になってやめました。

今回書いたコード

$ tree -a
.
├── .env.sample    # アカウントのIDやキーを設定 ※ファイル名を.envに変更すること
├── .git
│   :
:
├── .gitignore
├── categorys.csv  # カテゴリ一覧
└── main.py        # メインプログラム
main.py
import os
import urllib
import re
import pandas as pd
from dotenv import find_dotenv, load_dotenv
from bottlenose import Amazon
from bs4 import BeautifulSoup
from retry import retry

AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY')
AWS_ASSOCIATE_TAG = os.environ.get('AWS_ASSOCIATE_TAG')

# エラーの場合、1秒待機しリトライ(最大5回)
@retry(urllib.error.HTTPError, tries=5, delay=1)
def search(amazon, k, i):
    print('get products...')
    return amazon.ItemSearch(Keywords=k, SearchIndex=i)


def main():
    amazon = Amazon(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ASSOCIATE_TAG, Region='JP',
                    Parser=lambda text: BeautifulSoup(text, 'xml')
                    )

    keyword = input('keyword? >> ')

    df_category = pd.read_csv('categorys.csv')
    indexs = range(df_category.shape[0])

    while True:
        # show category
        for i, v in df_category.iterrows():
            print(str(i) + '. ' + v['DispName'])
        print('')

        num = input('category number? [None : All] >> ')
        if not num:
            category = 'All'
            break
        elif re.match('[\d]', num):
            num = int(num)
            if num in indexs:
                category = df_category.loc[num, 'SearchIndex']
                break

    response = search(amazon, keyword, category)

    for item in response.find_all('Item'):
        print(item.Title.string)


if __name__ == '__main__':
    # find .env automagically by walking up directories until it's found, then
    # load up the .env entries as environment variables
    load_dotenv(find_dotenv())

    main()
categorys.csv
SearchIndex,DispName
Apparel,服&ファッション小物
Appliances,大型家電
Automotive,カー・バイク用品
Baby,ベビー&マタニティ
Books,本(和書)
Electronics,家電&カメラ
Grocery,食品・飲料・お酒
HealthPersonalCare,ヘルス&ビューティー
Music,ミュージック
Software,ソフトウェア
SportingGoods,スポーツ&アウトドア
Toys,おもちゃ
VideoGames,ゲーム
Watches,時計
env.sample
# ファイル名を.envに変更すること
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_ASSOCIATE_TAG=

※ dotenvについてはこちら

注意すべき点はAPIの仕様で1時間当りの上限数(2000回)があるのですが、その制限内でも頻繁に503エラーが発生します。(調べた感じそういうものらしいです。。。)その対策でretryというライブラリを利用し、エラーとなったらリトライさせています。