はじめに
楽天ショップのジャンルを知りたくて、
PythonのRequestsモジュールで楽天APIを使ってみる を参考に
楽天APIとRequestモジュールを使って楽天商品の全ジャンルを取得してみた
環境:Windows7,Python3
サイトの調査
全ジャンルの取得をしているサイトを探したけど、
以下の表のように、親階層を意識せず、
下記のようなリストしか見つからなかった。
GenreLevel | GenreID | GenreName |
---|---|---|
1 | 510915 | ビール・洋酒 |
2 | 100324 | ビール・発泡酒 |
3 | 567652 | ノンアルコール |
僕は、階層を考慮した表を作りたい。
GenreID:1 | GenreName:1 | ・・・ | GenreID:N | GenreName:N |
---|---|---|---|---|
510915 | ビール・洋酒 | ・・・ | 567652 | ノンアルコール |
やったこと
親階層のジャンルID,ジャンル名を保持した状態で、ジャンルを取得し、
一覧を作成できるようにしてみた。
その際のスクリプトを、自身の振り返りもかねて記載。
※動いているから、ひとまず大丈夫そう
test.py
item_url = 'https://app.rakuten.co.jp/services/api/IchibaGenre/Search/20140222'
item_parameters = {
'applicationId': ***ApplicationID***,
'format': 'json',
'formatVersion': 2,
'genreId': 0,
}
# 最上位階層の取得
r = requests.get(item_url, params=item_parameters)
item_data = r.json()
sleep(1)
# 取得したジャンル情報を保持するデータフレームを用意
df_genre = pd.DataFrame()
# 階層を掘ってジャンル情報を取得する
for i in item_data["children"]:
# 最上段ジャンル情報
parent_genre_level = i["genreLevel"]
parent_genre_id = i["genreId"]
parent_genre_name = i["genreName"]
# 最上段ジャンルに紐づく、子ジャンル情報の取得
genre_list = []
df_genre = loop_get_genre(df_genre, genre_list, parent_genre_level, parent_genre_id, parent_genre_name)
df_genre.to_csv("genreList.csv", index=False)
【loop_get_genre】関数はこちら
test.py
def loop_get_genre(df, genre_list, genre_level, genre_id, genre_name):
"""
ジャンルID,ジャンル名を取得する
:param df: 取得ジャンル情報
:param genre_list: 対象ジャンル情報
:param genre_level: ジャンル階層
:param genre_id: ジャンルID
:param genre_name: ジャンル名
:return: 取得ジャンル情報
"""
# 関数内のリストにのみ反映させる
temp_genre = copy.deepcopy(genre_list)
# ジャンルID
temp_genre.extend([genre_level, genre_id, genre_name])
# 追加しようとするリストのサイズがDFの列サイズより小さいと警告が出るため、対処
add_null = 0
if len(df.columns) > len(temp_genre):
while len(df.columns) > len(temp_genre):
temp_genre.append("")
add_null += 1
df = df.append([temp_genre])
# 列サイズの対処処理を実施していた場合、元の列数に戻す
if add_null > 0:
for i in range(add_null):
temp_genre.pop()
# 現階層に対する子ジャンルが存在するかをチェックする
item_parameters["genreId"] = genre_id
get_api = requests.get(item_url, params=item_parameters)
temp_list = get_api.json()
sleep(1)
try:
# 子ジャンルが存在する場合、階層を下げてジャンル情報を取得する
child_genre_id = temp_list["children"]
for j in child_genre_id:
df = loop_get_genre(df, temp_genre, j["genreLevel"], j["genreId"], j["genreName"])
except:
pass
return df
まとめ
楽天APIの実行のルール(1秒間に1回まで)のため、全件取得に時間がかかりそう。
※まだ実行中(4時間経過)
あと、ヘッダーの設定をしていないので、
「GenreID:1」とかも、階層にあわせて設定できるようにしていきたい。
今後は、今回取得できるリストを使って、楽天商品をジャンル別に取得できればと思う。
以上。