楽天市場のジャンル一覧をツリー形式で作成する(Python)2019年版

投稿者: | 2019年1月4日

楽天APIを利用し、楽天市場のジャンル一覧を作成するプログラムをPythonで書きました。2017年にもジャンル一覧を作成しましたが、所々更新されているようなので、2019年版として改めてジャンル一覧を作成しました。見やすいように、親ジャンル、子ジャンルがツリー形式となるようにしてあります。

ソースコード

楽天APIから、ツリー形式のジャンル一覧を作成するPythonソースコードは下記の通りです。取得にかかる時間を計算するため、datetimeをインポートしています。(私の環境では、全部取得するのに、2時間58分35秒かかりました)

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

import datetime 
import json 
import requests

#楽天APIのURL
genre_search_url = "https://app.rakuten.co.jp/services/api/IchibaGenre/Search/20140222?"

#開始時間(後で取得にかかった時間を算出するため)
starttime = datetime.datetime.today()

def export_text(text1):
	fmt_name = "RakutenGenreTree.txt"
	with open(fmt_name, "a") as f:
		f.write("\n{0}".format(text1))

def get_child_list(genreid): 
    record = []     #[[ジャンルID,ジャンル名],[ジャンルID,ジャンル名]・・・]という形で子ジャンルを保管するリスト
    record2 = []    #[ジャンルID,ジャンル名]を一時的に保管するリスト

    payload = {
               'applicationId': 「あなたのIDを入力してください」,
               'genreId': genreid,
               }

    try:    #まれにエラーとなるため、念のためtryステートメントを付ける
        r = requests.get(genre_search_url, params=payload)
        res = r.json()
    
        for i in res["children"]:
            item = i["child"]
            
            record2.append(item["genreId"])
            record2.append(item["genreName"])
            record.append(record2)
            
            record2 = []

        if record == []:
            return 0
        else:
            return record
        
    except:
        print("API Error")
        return 0
        

def draw_tree(genre, space = " \t"):
	print(genre)
	child_list = get_child_list(genre[0])
	if child_list == 0 or None:
		return
	for i in range(len(child_list)):
		if i != len(child_list)-1:
			export_text(space+"┣━"+str(child_list[i]))
			child_list2 = get_child_list(child_list[i][0])
			if child_list2 == 0:
				continue
			else:
				draw_tree(child_list[i], space = space + "┃\t")
		else:
			export_text(space+u"┗━"+str(child_list[i]))
			draw_tree(child_list[i], space = space + "\t\t")
	return
		
def main():
    genre = ['0','root']    #"0"はrootを表す
    export_text(str(genre))
    draw_tree(genre)
    
    endtime = datetime.datetime.today()
    s_time = endtime - starttime
    print("ジャンル取得にかかった時間は、  ",s_time,"  です")
		
if __name__ == '__main__':
    main()

 

結果

取得結果は、1万行を超えるのでこちらからご確認ください。


											

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です