ぷろぐら×でざいん

Amazon Product Advertising APIでイメージURLを取得する

Amazon Product Advertising APIでイメージURLを取得する

Amazon Product Advertising APIでイメージURLを取得する

前提

AWSアカウント既に持っており、Amazon アソシエイト・プログラムに参加している方。


目的

Amazonの商品情報だけでなく、イメージURLを同時に取得する。多くのブログ記事では商品検索し終わりであったり、ASINから画像URLを取得する方法が記載されていますが、中々商品検索したもののイメージURLを同時に取得する方法がなく困りました。なら、自分で作るしかないということで今回作ってみました。


インストール

    • bottlenose: Amazon APIを最小限の実装で利用できるモジュール
  • beautifulsoup4: 返り値のXMLをパースするのに利用する
pip install bottlenose
pip install beautifulsoup4

コード全体

import random
import time
from urllib2 import HTTPError

import bottlenose
from bs4 import BeautifulSoup


AWS_ACCESS_KEY = ''
AWS_SECRET_KEY = ''
ASSOSIATE_ID = ''



class AmazonAPI(object):
    def __init__(self):
        self.amazon = bottlenose.Amazon(AWS_ACCESS_KEY,
                                        AWS_SECRET_KEY,
                                        ASSOSIATE_ID,
                                        Region='JP',
                                        ErrorHandler=self.error_handler)

    def error_handler(self, err):
        ex = err['exception']
        if isinstance(ex, HTTPError) and ex.code == 503:
            time.sleep(random.expovariate(1.1))
            return True

    def search_item(self, search_index, key_word):
        """
        :param unicode search_index:
        :param unicode key_word:
        :rtype: list
        """
        response_group = 'Images, ItemAttributes'
        response = self._item_search(SearchIndex=search_index, 
        			          Keywords=key_word, 
        			          ResponseGroup=response_group)
        if not response:
            return None

        soup = BeautifulSoup(response, 'lxml')
        item_data = []
        for item in soup.findAll('item'):
            item_data.append({
                'asin': item.find('asin').text,
                'title': item.find('title').text,
                'author': item.find('author').text,
                'manufacturer': item.find('manufacturer').text,
                'detailpageurl': item.find('detailpageurl').text,
                'largeimage': item.find('largeimage').find('url').text,
                'publicationdate': item.find('publicationdate').text,
                'numberofpages': item.find('numberofpages').text,
                'publisher': item.find('publisher').text,
                'releasedate': item.find('releasedate').text,
                'studio': item.find('studio').text,
                'hiresimage': item.find('hiresimage').text,
                'mediumimage': item.find('mediumimage').text,
            })

        return item_data

    def _item_search(self, **kwargs):
        return self.amazon.ItemSearch(**kwargs)

コードの解説

エラーハンドラー

このAPIには制限があり、1時間に送れるリクエストは3,600回と言われています。他には2,000回と仰っている方もいるので、大体1リクエストあたり1 ~ 2秒間あける必要があります。それでも 503になる場合があるので、このError Handlerではそれをキャッチし、再度スリープさせ、リクエストを再開できる仕様にしています。

    def error_handler(self, err):
        ex = err['exception']
        if isinstance(ex, HTTPError) and ex.code == 503:
            time.sleep(random.expovariate(1.1))
            return True

検索

レスポンスグループを複数持つことにより、商品情報とその商品に関するイメージを取得するようにしています。SearchIndexの種類に関してはこのサイトがよくまとめてありますのでご参考ください。
Response Groups – Product Advertising API

        response_group = 'Images, ItemAttributes'
        response = self._item_search(SearchIndex=search_index, 
        			          Keywords=key_word, 
        			          ResponseGroup=response_group)

    def _item_search(self, **kwargs):
        return self.amazon.ItemSearch(**kwargs)


パース

最大10件のデータを取得することができます。まだ、下記のデータ以外にも取得することができますので、是非ご自身でお試しください。

        soup = BeautifulSoup(response, 'lxml')
        item_data = []
        for item in soup.findAll('item'):
            item_data.append({
                'asin': item.find('asin').text,
                'title': item.find('title').text,
                'author': item.find('author').text,
                'manufacturer': item.find('manufacturer').text,
                'detailpageurl': item.find('detailpageurl').text,
                'largeimage': item.find('largeimage').find('url').text,
                'publicationdate': item.find('publicationdate').text,
                'numberofpages': item.find('numberofpages').text,
                'publisher': item.find('publisher').text,
                'releasedate': item.find('releasedate').text,
                'studio': item.find('studio').text,
                'hiresimage': item.find('hiresimage').text,
                'mediumimage': item.find('mediumimage').text,
            })

あとがき

どうだったでしょうか。レスポンスはご自身で実際に叩いてご確認頂ければ幸いです。このAPIは奥が深そうなのでまだまだ知らないことがたくさんありそうです。また、何か発見したら追記していきたいと思います。今後ともよろしくお願い致します。


参照

lionheart/bottlenose · GitHub

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です