楽天APIを使ってジャンルの一覧を取得する

# はじめに
[楽天API](https://webservice.rakuten.co.jp/documentation)というものがあったのでpythonを使ってジャンル一覧を取得してみました！

# 準備
[楽天のジャンルAPI](https://webservice.rakuten.co.jp/documentation/ichiba-genre-search)のドキュメントには、以下のような形でapplicationIdの実行が必須である。

- リクエストURL（REST／JSON形式の場合）

```
https://app.rakuten.co.jp/services/api/IchibaGenre/Search/20140222?
        applicationId=[アプリID]&
        genreId=0
```

## applicationId取得方法
https://webservice.rakuten.co.jp/

こちらのサイトへアクセスし、楽天会員のID, passwordを利用してログインする。
ログイン後、右上のアプリID発行ボタンから、アプリ名・URLを入力し、新規アプリ作成をクリック。
![Screen Shot 2021-12-26 at 15.53.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613110/41999303-178a-e054-1150-1625e3067055.png)

次のページに遷移し、以下が3つ発行される。

- アプリID/デベロッパーID
- application_secret
- アフィリエイトID

※今回利用するのは発行されたアプリID



# pythonでコーディング
## 第一階層目のジャンル取得
### コード

```python
import requests

RAKUTEN_GENRE_API_URL = 'https://app.rakuten.co.jp/services/api/IchibaGenre/Search/20140222'
params = {
    'applicationId': 'アプリID',
    'formatVersion': 2, 
    'genreId': 0,   
}
r = requests.get(RAKUTEN_GENRE_API_URL, params=params)
item_data = r.json()
```

- formatVersionについて

formatVersion=1 の場合:
配列データに関して、以下の様にデータが返る。

```json
{"items": [
    {"item": {
        "itemName": "a",
        "itemPrice": 10
    }},
    {"item": {
        "itemName": "b",
        "itemPrice": 20
    }}
]}
```

formatVersion=2 の場合:
下記のように、配列中の重複するオブジェクトが省略される。

```json
{"items": [
    {
        "itemName": "a",
        "itemPrice": 10
    },
    {
        "itemName": "b",
        "itemPrice": 20
    }
]}
```

### 取得結果
以下のように39種類のジャンルが取得できた。

```json
{'brothers': [],
 'children': [{'genreId': 100371, 'genreLevel': 1, 'genreName': 'レディースファッション'},
  {'genreId': 551177, 'genreLevel': 1, 'genreName': 'メンズファッション'},
  {'genreId': 100433, 'genreLevel': 1, 'genreName': 'インナー・下着・ナイトウェア'},
  {'genreId': 216131, 'genreLevel': 1, 'genreName': 'バッグ・小物・ブランド雑貨'},
  {'genreId': 558885, 'genreLevel': 1, 'genreName': '靴'},
  {'genreId': 558929, 'genreLevel': 1, 'genreName': '腕時計'},
  {'genreId': 216129, 'genreLevel': 1, 'genreName': 'ジュエリー・アクセサリー'},
  {'genreId': 100533, 'genreLevel': 1, 'genreName': 'キッズ・ベビー・マタニティ'},
  {'genreId': 566382, 'genreLevel': 1, 'genreName': 'おもちゃ'},
  {'genreId': 101070, 'genreLevel': 1, 'genreName': 'スポーツ・アウトドア'},
  {'genreId': 562637, 'genreLevel': 1, 'genreName': '家電'},
  {'genreId': 211742, 'genreLevel': 1, 'genreName': 'TV・オーディオ・カメラ'},
  {'genreId': 100026, 'genreLevel': 1, 'genreName': 'パソコン・周辺機器'},
  {'genreId': 564500, 'genreLevel': 1, 'genreName': 'スマートフォン・タブレット'},
  {'genreId': 565004, 'genreLevel': 1, 'genreName': '光回線・モバイル通信'},
  {'genreId': 100227, 'genreLevel': 1, 'genreName': '食品'},
  {'genreId': 551167, 'genreLevel': 1, 'genreName': 'スイーツ・お菓子'},
  {'genreId': 100316, 'genreLevel': 1, 'genreName': '水・ソフトドリンク'},
  {'genreId': 510915, 'genreLevel': 1, 'genreName': 'ビール・洋酒'},
  {'genreId': 510901, 'genreLevel': 1, 'genreName': '日本酒・焼酎'},
  {'genreId': 100804, 'genreLevel': 1, 'genreName': 'インテリア・寝具・収納'},
  {'genreId': 215783, 'genreLevel': 1, 'genreName': '日用品雑貨・文房具・手芸'},
  {'genreId': 558944, 'genreLevel': 1, 'genreName': 'キッチン用品・食器・調理器具'},
  {'genreId': 200162, 'genreLevel': 1, 'genreName': '本・雑誌・コミック'},
  {'genreId': 101240, 'genreLevel': 1, 'genreName': 'CD・DVD'},
  {'genreId': 101205, 'genreLevel': 1, 'genreName': 'テレビゲーム'},
  {'genreId': 101164, 'genreLevel': 1, 'genreName': 'ホビー'},
  {'genreId': 112493, 'genreLevel': 1, 'genreName': '楽器・音響機器'},
  {'genreId': 101114, 'genreLevel': 1, 'genreName': '車・バイク'},
  {'genreId': 503190, 'genreLevel': 1, 'genreName': '車用品・バイク用品'},
  {'genreId': 100939, 'genreLevel': 1, 'genreName': '美容・コスメ・香水'},
  {'genreId': 100938, 'genreLevel': 1, 'genreName': 'ダイエット・健康'},
  {'genreId': 551169, 'genreLevel': 1, 'genreName': '医薬品・コンタクト・介護'},
  {'genreId': 101213, 'genreLevel': 1, 'genreName': 'ペット・ペットグッズ'},
  {'genreId': 100005, 'genreLevel': 1, 'genreName': '花・ガーデン・DIY'},
  {'genreId': 101438, 'genreLevel': 1, 'genreName': 'サービス・リフォーム'},
  {'genreId': 111427, 'genreLevel': 1, 'genreName': '住宅・不動産'},
  {'genreId': 101381, 'genreLevel': 1, 'genreName': 'カタログギフト・チケット'},
  {'genreId': 100000, 'genreLevel': 1, 'genreName': '百貨店・総合通販・ギフト'}],
 'current': {'genreId': 0, 'genreLevel': 0, 'genreName': ''},
 'parents': [],
 'tagGroups': []}
```

第二階層以下のジャンルは、上位階層の'genreId'をAPIに与えてあげることで取得可能


# おわりに
楽天のAPIで簡単にジャンルの取得ができました。

# 参考
https://webservice.rakuten.co.jp/documentation