PythonとAmazon Product Advertising APIでアフィリエイトリンク作成のイメージ画像

PythonとAmazon Product Advertising APIでアフィリエイトリンク作成

  • 公開日:2018/06/17
  • 更新日:2018/10/19
  • 投稿者:n bit

Python3とAmazon Product Advertising APIを利用してアマゾンアソシエイトのアフィリエイトリンクを自動生成するコードを作ってみました。APIを利用してXMLデータを取得するまでの基本的な解説やレスポンス要素の一覧表などをつけています。

  • Python

この記事は約 分で読めます。(文字)

Amazon Product Advertising API とは

「Amazon Product Advertising API」とはアマゾン内で取り扱いがある商品の価格やその他様々な情報をAPI経由で取得できるものです。このAPIは登録だけ行えば無料で利用することができます。

「Amazon Product Advertising API」の利用に必要なもの

「Amazon Product Advertising API」を利用するには事前に「Amazonアソシエイト」と「Amazon Product Advertising API」に登録を行い下記の3つの値を取得しておく必要があります。

  • アソシエイトID:Amazonアソシエイトで取得
  • アクセスキー:Amazon Product Advertising API で取得
  • シークレットキー:Amazon Product Advertising API で取得

この3つの値を含めたAPIのコードを記述し、後は、商品のASINコードをAPIに渡せば該当する商品の情報が取得できます。

Amazon Product Advertising APIに必要なIDとキーを取得する

まずは登録作業を済まし3つの値を取得しておきましょう。

Amazonアソシエイトの登録

Amazonアソシエイトの登録方法ついては多くのページで詳しく解説しています。まだアマゾンアソシエイトの新規登録が完了していない方はそれらを参考にして登録を済ませておいてください。

アソシエイトIDは複数発行することができます。今回のAPI用に新しくアソシエイトIDを発行したい方は事前に発行しておきましょう。

Amazon Product Advertising APIの登録方法

Amazon Product Advertising APIの登録方法を解説していきます。すでにアマゾンアソシエイトの登録が完了している場合はとても簡単です。

Product Advertising API ページにアクセス

Amazonアソシエイトへログインして「Product Advertising API」のページにアクセスします。アマゾンアソシエイトにログインしたら

  • メインメニュー > ツール > Product Advertising API

と進んでください。

Amazon Product Advertising API ページにアクセス

Product Advertising API の利用開始

下記の画面が表示されますので「利用をはじめる」ボタンをクリックしましょう。

Amazon Product Advertising API キーの取得

アクセスキーとシークレットキーの取得

アクセスキーとシークレットキーが表示されますのでそれぞれコピーして保存しておきましょう。下側の「認証情報をダウンロードする」ボタンを押すことでCSVファイルをダウンロードすることもできます。

Amazon Product Advertising API キーの保存

キーの保存が完了しましたら「認証キーの管理」リンクをクリックして次のページに進みます。

Product Advertising APIの登録完了

認証キーの管理ページが表示され、先程取得したアクセスキーが表示されていれば無事にすべての登録作業が完了です。

Amazon Product Advertising API 作業完了

これで3つの値全て取得完了です。

PythonでAPI用のコードを記述してXMLデータを取得する

ここからは実際にPythonでAPI用のコードを記述してXMLデータを取得していきます。

Product Advertising APIを使うときの注意点

APIを使うときにいくつかの制限事項や注意事項があります。

  • 1時間のリクエスト制限は3,600回以内
  • Kindleの価格は取得できない
  • API経由での取得エラーが割と起こるのでその対策が必要

よほどのことがない限り1つ目のリクエスト制限はアフィリエイトリンクの作成でほぼ引っかかる事はないと思います。

Kindleの価格に関してはAPI経由でどうやっても取得することができません。どうしても取得したい方はURLを取得した後にサイトからスクレイピングして取得する必要があります。アマゾンのサイトがスクレイピングしても大丈夫なのかどうか調べていないのと、Kindleの価格がそこまで今回は必要ではなかったため取得していません。

実際に取得してみた感じでは割と取得エラーが起こります。try文か、if文を使ってエラー回避をする必要があります。私はif文を使ってリクエストコード判定を行い、正常に取得していなかった場合は再度取得するように繰り返し処理を入れています。

API経由で取得するためのPythonコード

今回は長くなるため基本的の取得処理のみ記載しています。最終はご自分のご利用環境に合わせてカスタムしていただければと思います。特にエラー回避の処理等は必須となります。

# -*- coding: utf-8 -*-

import sys
import requests
import hmac
import hashlib
import base64
import urllib.parse
from datetime import datetime
from bs4 import BeautifulSoup


class AmazonProductAdvertisingAPI:

def __init__(self, associate_id='xxxxxxxx-22'):
""" 初期化処理 """
# ハッシュ関数とエンコードをset
self.hash_func = hashlib.sha256
self.encode_func = base64.b64encode
#id,keyのset
self.ACCESS_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxx'
self.SECRET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
self.ASSOCIATE_ID = associate_id

def get_info(self, asin_code='XXXXXXXXXX'):
api_domain = 'webservices.amazon.co.jp'
api_page = '/onca/xml'
# 商品のASINコード、ASINコードがない場合はISBN-10
asin_code = asin_code
# パラメーター用のタイムスタンプを生成
time_stamp = urllib.parse.quote(datetime.now().strftime('%Y-%m-%dT%H:%M:%S'))
# URLパラメータのセット
query='AWSAccessKeyId=' + self.ACCESS_KEY + \
'&AssociateTag=' + self.ASSOCIATE_ID + \
'&ItemId=' + asin_code + \
'&Operation=ItemLookup' + \
'&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews' + \
'&Service=AWSECommerceService' + \
'&Timestamp=' + time_stamp + \
'&Version=2013-08-01'
message = '\n'.join(['GET', api_domain, api_page, query])
# HMACのSignature生成(ハッシュ値を算出)
sing_gen = hmac.new(self.SECRET_KEY.encode('utf8'), message.encode('utf8'), self.hash_func)
raw_sign = sing_gen.digest()
sign = urllib.parse.quote(self.encode_func(raw_sign))

# API用URLの生成
url = 'http://' + api_domain + api_page + '?' + query + '&Signature=' + sign

res = requests.get(url)
soup = BeautifulSoup(res.text,'lxml')

# 商品情報を取得
productgroup = self.get_productgroup(soup)
detailpageurl = self.get_url(soup)
largeimage = self.get_largeimage(soup)
title = self.get_title(soup)
price = self.get_price(soup)
amount = self.get_amount(soup)
price_time = datetime.now().strftime('%Y年%m月%d日 %H時%M分時点')
author = self.get_author(soup)
brand = self.get_brand(soup)
link_text = 'Amazon 詳細ページへ'


result = {'productgroup':productgroup, 'asin_code':asin_code, 'detailpageurl':detailpageurl, 'largeimage':largeimage, 'title':title, 'price':price, 'amount':amount, 'author':author, 'brand':brand, 'price_time':price_time, 'link_text':link_text}

return result

def get_productgroup(self, soup):
return soup.find('itemattributes').find('productgroup').text.strip()

def get_url(self, soup):
return soup.find('item').find('detailpageurl').text.strip()

def get_largeimage(self, soup):
return soup.find('largeimage').find('url').text.strip()

def get_title(self, soup):
return soup.find('itemattributes').find('title').text.strip()

def get_price(self, soup):
return soup.find('offersummary').find('formattedprice').text.strip()

def get_amount(self, soup):
return soup.find('offersummary').find('amount').text.strip()

def get_brand(self, soup):
return soup.find('itemattributes').find('publisher').text.strip()

def get_author(self, soup):
return soup.find('itemattributes').find('author').text.strip()

以下にコードの内容の補足を入れておきます。

API経由での検索方法を指定

API経由でアマゾンをどのように検索するかを指定できます。今回はASINを使って個別商品の詳細情報を取得したかったので「ItemLookup」をしています。

Operation=ItemLookup

API経由のデータ取得と整形

API用に作成したURLからrequestsを使ってxmlデータを取得し、BeautifulSoupで扱えるように変換しています。

        res = requests.get(url)

soup = BeautifulSoup(res.text,'lxml')

パーサで変換した後は必要なレスポンス要素を1つずつ取得して変数に代入しています。

取得できるデータの一覧

設定次第ではAPI経由でかなりたくさんのデータが取得できます。下記の表では今回Amazonへのアフィリエイトリンクを作成するために必要となったデータを取得するためのレスポンス要素を一覧にしています。

レスポンス要素説明
productgroup商品が足している商品カテゴリー
ex:Book、eBoos
detailpageurl商品の詳細ページのURL
largeimage大きなサイズの画像に関する情報
title商品のタイトル、または、名前
formattedprice表示用に書式設定された価格
ex:¥1,200
amount書式設定されていない数字だけの価格
ex:1200
publisher出版社名
author著者や商品のメーカー

これ以外にも数多くの項目を取得することができます。詳しくは公式サイトの方ご確認ください。

  • 公式サイト:Product AdvertisingAPI

今日のdot

今回は「Product Advertising API」を使ってAmazon内の個別商品の詳細情報を取得する方法解説しました。こちらのコードをベースにさまざまにカスタムすることでより便利に活用することができます。

このページのコードをもとにアマゾンのアフィリエイトリンクの一括作成ツールを作りました。自分で作るのがめんどくさい方や私が作っているツールで特に問題がない方はそちらのツールをお使いください。