2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonで楽天APIを使ったジャンル一覧リストの作成

Posted at

はじめに

楽天ショップのジャンルを知りたくて、
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」とかも、階層にあわせて設定できるようにしていきたい。

今後は、今回取得できるリストを使って、楽天商品をジャンル別に取得できればと思う。

以上。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?