Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

使用するライブラリ

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

$ pip install bottlenose

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

今回書いたコード

https://github.com/maroemon58/simple-amazon-item-search

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away