【Python】KeepaAPIで取得した商品情報

スポンサーリンク

KeepaAPIを使ってAmazonの商品情報を取得できるようになりました。

取得した商品情報には何が乗っているでしょうか?

KeepaAPIで取得した商品情報の型を調べる

KeepaAPIで取得した商品情報の型を見てみましょう。

型を調べる時は、『type(調べたい変数)』で調べる事ができます。

api_key='(認証コード64文字)'
api = keepa.Keepa(api_key)
products = api.query(['B083P5P8B5'],domain='JP')
print(type(products))
print(type(products[0]))

ASINから取得した商品情報(products)は、List型です。(青色)

List型だった為、productsの中には複数の商品情報が入っていることになります。

今回は1商品しか取得していないので、1つですが。。。

調べたいASINをリストとして複数書けば、複数取得も可能です。

では、本命の商品情報について調べましょう。(赤色)

 <class 'list'>
 <class 'dict'>

『dict』と書いてます。これはDictionary型だという事です。

Dictionary型には、KeyとValueが存在します。

Keyが分からない事にはValueを取得する事ができません。

Dictionary型のKeyを取得する

Dictionary型のKeyを取得します。

api = keepa.Keepa(api_key)
products = api.query('B083P5P8B5',domain='JP')
for item in products[0].keys():
     print(item)

Dictionaryのkeys()という関数でKeyを取得する事が可能です。

keyの数だけループが回るように作りました。

そして、keyが何なのか出力します。

結果はこんな感じ

csv
categories
imagesCSV
manufacturer
title
(長いので省略)
offersSuccessful
g
categoryTree
data

DictionaryのKeyが分かったのでValueを表示

全てを表示してもいいのですが、長くなってしまうので、今回は商品名を取得しましょう。

api = keepa.Keepa(api_key)
products = api.query('B083P5P8B5',domain='JP')
print(products[0]['title'])

これで商品名を取得する事ができます。

結果は下記の通り

ルービックケージ (Rubik's Cage)

商品名を取得する事ができました。

他にもいろいろな情報が取得できるので、Keyの部分を変えて表示してみましょう。

KeepaAPIで取得した商品情報のkeyの型を調べる

Keyが分かりましたがValueが必ずしも文字とは限りません。

そこでDictionaryの中のKeyの型を更に調べます。

Keyを取得した方法にtypeも一緒に表示させてみました。

api = keepa.Keepa(api_key)
products = api.query('B083P5P8B5',domain='JP')
for item in products[0].keys():
    print(item + ':' + str(type(products[0][item])))

結果はこんな感じになりました。

csv:<class 'list'>
categories:<class 'list'>
imagesCSV:<class 'str'>
manufacturer:<class 'str'>
title:<class 'str'>
(長いので省略)
offersSuccessful:<class 'bool'>
g:<class 'int'>
categoryTree:<class 'list'>
data:<class 'dict'>

なるほど・・・Dictionary型の中にDictionary型が。。。

全てのKeyが分かるように関数を組みます。

型がDictionaryだったら、そのDictionaryのKeyを取得するように再帰的に関数を回しましょう!!

Dictionaryの時は再帰的に関数を

まずは、今までの内容を関数にします。

def Search_DictKey(dictionary):
     for item in dictionary.keys():
         print(item + ':' + str(type(dictionary[item])))

関数名はSearch_DictKeyにしました。引数にはDictionaryが入ります。

api = keepa.Keepa(api_key)
products = api.query('B083P5P8B5',domain='JP')
for product in products:
     Search_DictKey(product)

これで先ほどと変わらない結果になりました。

次に関数に型がDictionaryならという条件を追加します。

def Search_DictKey(dictionary):
    for item in dictionary.keys():
        print(item + ':' + str(type(dictionary[item])))
        if type(dictionary[item]) is dict:
            Search_DictKey(dictionary[item])

if分を使って、Dictionaryかどうかの判断をしました(黄色)

そして、Dictionary型の時は、もう一度同じ関数を実行します。

これを再帰関数と呼びます。同じことを書かなくていいから覚えておくと便利です。

出力の結果は。。。

やってみてもらえればわかりますが、再帰的に回っているところが分かりませんでしたorz

そこで、引数を追加し、区切りをわかりやすくしましょう。

def Search_DictKey(dictionary,arg=''):
    for item in dictionary.keys():
        print(arg + item + ':' + str(type(dictionary[item])))
        if type(dictionary[item]) is dict:
            Search_DictKey(dictionary[item],arg + '\t')

引数に区切り文字となるものを貰うようにしました。※省略時は空文字

再帰的に回るときは頭にタブ(\t)がつくようにし、段落ができるようになりました。

下記は出力の一部抜粋

data:<class 'dict'>
        AMAZON_time:<class 'numpy.ndarray'>
        AMAZON:<class 'numpy.ndarray'>
        df_AMAZON:<class 'pandas.core.frame.DataFrame'>

これで取得した商品情報のDictionary型のKeyを全て取得する事ができました。

まとめ

今回は、取得した商品情報の型を調べました。

Dictionary型の場合は、KeyとValueが存在し、Dictionaryに登録されているKeyを取得するようにします。

そしてDictionaryのValueがDictionaryの場合は、再帰的に関数を回し、全てのKeyを取得できるようにしました。

まだKeeaAPIから取得した商品情報の詳細までには辿り着いていませんが、Keyが分かるだけで大きな一歩を踏み出せています。

コメント

  1. ヤマグチ より:

    はじめましてコメント失礼致します。
    こちらの記事を参考にkeepa api からAmazon 中古最安値 ランキング 出品数を取得を試みているのですが、どうもうまく行きません。ご教授おねがいできるでしょうか。不躾なコメントで申し訳ございません。

    • ポジティブ育児パパ より:

      はじめまして。
      質問ありがとうございます。
      内容が理解できない為、質問を質問で返して申し訳ありません。
      商品情報が取得出来ていないのでしょうか?
      それとも、商品情報が取得出来ているけど、取得したデータの中でどこに何があるか分からないという意味でしょうか?

      情報としては、下記ブログが分かりやすく説明されております。
      https://tooledbuppan.com/keepa-api-3/

      もし取得が目的であるなら、Seleniumを使う事も視野に入れてもいいかもしれません。
      ブラウザ操作なので、処理時間は、APIよりかなり遅くなります。
      ブラウザの画面から取得する為、
      [検索]の結果の画面のtab[Amazon価格履歴]の[統計]からランキングを取得したり、
      tab[Data]から必要な情報を取得したり
      集計された結果を取得した方が楽だと思います。

タイトルとURLをコピーしました