LoginSignup
24
24

More than 5 years have passed since last update.

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

Posted at

はじめに

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

24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24