はじめに
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というライブラリを利用し、エラーとなったらリトライさせています。