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

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

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

yusukeito58
■25歳時に異業種からWeb系企業に転職、現在はフリーランスとして活動■ECサイトの開発が得意■バックエンド(PHP、Ruby、Python)がメイン、フロントエンドも少々■筋トレ、ゴルフ、読書が趣味■エンジニアとしてのキャリア、アプリ開発、書評をメインに発信しています。経歴や実績、お仕事のお問い合わせ👉 http://i-yusuke.com/portfolio/
http://i-yusuke.com
Why not register and get more from Qiita?
  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