📝
API取得
卒業研修でAPIを取得する作業のまとめ記事
なろう小説API(小説)
なろう小説APIでは小説家になろうに掲載されている作品情報を取得できます。 なろうAPIはHTTPでのリクエストに対してJSON形式、JSONP形式又はYAML形式、PHPのserializeで応答します。
Spotify(音楽)
Spotifyは、世界中のクリエイターによる数千万もの音楽やポッドキャスト、ビデオを楽しめるデジタル配信サービスです。
メディア芸術データベース(アニメ、 映画、 漫画、 ゲーム)
メディア芸術データベースとは、 文化芸術基本法の第9条に基づき、文化庁が開設した。 漫画、アニメ、コンピュータゲーム、メディアアートの4分野を扱うデータベースである。 漫画の場合は明治初期から現在に至るまでの作品を収録し、メディアアート分野では1951年以降に開催された展覧会やイベント情報を収める。
から情報をお借りしました。
参考資料
環境設定
Python を使用いたしました。
まず取得したいを上のURLを飛んだ先のとこ探しそこから卒業研究に必要な情報を抜き出しましょう。(抜き出すAPIをメモ帳に書いておくといちいち見直す必要がなくてよきです)
なろう小説 例
novels.py
from util import load_json, write_json
import datetime
import os
input_path = "./input_novels.json"
output_path = "./output/novels.json"
def main():
# input_pathを読み取る
input = load_json(input_path)
output = []
# 前処理
for art in input:
row = {
"type": "novels.json",
}
row["title"] = get_title(art)
row["keyword"] = get_key_word(art)
row["general_firstup"] = get_general_firstup(art)
row["global_point"] = global_point(art)
output.append(row)
#作品名
def get_title(art):
title:list[str] = art["title"].split("/")
for index, item in enumerate(title):
title[index] = str.strip(item)
return title
#キーワード
def get_key_word(art):
key_word:list[str] = art["keyword"].split("/")
for index, item in enumerate(key_word):
key_word[index] = str.strip(item)
return key_word
#初期記載日
def get_general_firstup(art):
if "startDate" not in art:
return None
date = datetime.datetime.strptime(art["startDate"], "%Y-%m-%d")
return date.year
#残酷な描写あり
def global_point(art):
global_point:list[str] = art["global_point"].sorted()
for index, item in enumerate(global_point):
global_point[index] = str.strip(item)
return global_point
}
作成するのに必要なAPIを取得し必要のないもの削除します。
jsonファイルで保存します。
結果(なろう小説API)
novels.json
"title": "とんでもスキルで異世界放浪メシ",
"writer": "江口 連",
"biggenre": 2,
"genre": 201,
"keyword": "R15 残酷な描写あり 異世界転移 異世界 ネットスーパー 勇者召喚 巻き込まれ ペットが最強 料理 ほのぼの のほほん 旅",
"general_firstup": "2016-01-05 01:24:12",
"noveltype": 1,
"time": 4327,
"isr15": 1,
"isbl": 0,
"isgl": 0,
"global_point": 869749,
"quarter_point": 14892
},
{
"title": "無職転生 - 異世界行ったら本気だす -",
"writer": "理不尽な孫の手",
"biggenre": 2,
"genre": 201,
"keyword": "R15 残酷な描写あり 異世界転生",
"general_firstup": "2012-11-22 17:00:34",
"noveltype": 1,
"time": 5661,
"isr15": 1,
"isbl": 0,
"isgl": 0,
"global_point": 846205,
"quarter_point": 14410
},
{
"title": "ありふれた職業で世界最強",
"writer": "厨二好き/白米良",
"biggenre": 2,
"genre": 201,
"keyword": "R15 残酷な描写あり 異世界転移 そのうち主人公最強 豹変する主人公 鬼畜 ご都合主義 異世界召喚 オリジナル兵器 ハーレム テンプレ要素多数",
"general_firstup": "2013-11-07 15:49:34",
"noveltype": 1,
"time": 11050,
"isr15": 1,
"isbl": 0,
"isgl": 0,
"global_point": 693920,
"quarter_point": 4948
},
{
"title": "ヘルモード ~やり込み好きのゲーマーは廃設定の異世界で無双する~",
"writer": "ハム男",
"biggenre": 2,
"genre": 201,
"keyword": "R15 残酷な描写あり 異世界転生 身分差 サラリーマン 男主人公 召喚士 剣と魔法 レベル ステータス チート 学園 ダンジョン 成りあがり 無双 いずれ主人公最強 勇者と魔王 ESN大賞2",
"general_firstup": "2019-11-17 22:05:56",
"noveltype": 1,
"time": 5335,
"isr15": 1,
"isbl": 0,
"isgl": 0,
"global_point": 674905,
"quarter_point": 12072
}
メディア芸術データベース(アニメ)
anime_regular.py
import json
from util import load_json, write_json
import datetime
input_path = "./input/anime_regular.json"
output_path = "./output/anime_regular.json"
def main():
# input_pathを読み取る
input = load_json(input_path)
output = []
# 前処理
for art in input:
row = {
"type": "anime-regular.json",
}
row["startYear"] = get_start_year(art)
row["relatedItemName"] = get_related_item_name(art)
row["actor"] = get_actor(art)
row["originalWorkCreator"] = get_originalg_Work_Creator(art)
row["datePublished"] = get_date_Pub_lished(art)
row["creator"] = get_creatoor(art)
row["productionCompany"] = get_productio_Company(art)
row["genre"] = get_genre(art)
row["character"] = get_char_acter(art)
output.append(row)
#開始年月
def get_start_year(art):
if "startDate" not in art:
return None
date = datetime.datetime.strptime(art["startDate"], "%Y-%m-%d")
return date.year
#関連作品
def get_related_item_name(art):
related_item_names :list[str] = art["relatedItemName"].split("/")
for index, item in enumerate(related_item_names):
related_item_names[index] = str.strip(item)
return related_item_names
#キャスト名
def get_actor(art):
actor : list[str] = art ["actor"].split("/","【】")
for index, item in enumerate(actor):
actor[index] = str.strip(item)
return actor
#原作者名
def get_originalg_Work_Creator(art):
originalg_Work_Creator : list[str] = art ["originalWorkCreator"].split("/","[]")
for index, item in enumerate(get_originalg_Work_Creator):
get_originalg_Work_Creator[index] = str.strip(item)
return originalg_Work_Creator
#キャスト名
def get_actor(art):
actor : list[str] = art ["actor"].split("/","【】")
for index, item in enumerate(actor):
actor[index] = str.strip(item)
return actor
#公開年月日
def get_date_Pub_lished(art):
if "datePublished" not in art:
return None
date = datetime.datetime.strptime(art["datePublished"], "%Y-%m-%d")
return date.year
#ジャンル
def get_genre_item_name(art):
genre_item_names : list[str] = art ["genre"].split("")
for index, item in enumerate(genre_item_names):
genre_item_names[index] = str.strip(item)
return genre_item_names
#楽曲
def get_track_item_name(art):
track_item_names : list[str] = art ["track"].split("「」")
for index, item in enumerate(track_item_names):
track_item_names[index] = str.strip(item)
return track_item_names
#データ出典
def get_source_item_name(art):
source_item_names : list[str] = art ["source"].split("()","、","+")
for index, item in enumerate(source_item_names):
source_item_names[index] = str.strip(item)
return source_item_names
#制作者名
def get_productio_Company(art):
productio_Company : list[str] = art ["productioCompany"].split("/")
for index, item in enumerate(productio_Company):
productio_Company[index] = str.strip(item)
return productio_Company
#作者
def get_creatoor(art):
creatoor: list[str] = art ["creator"].split("[]")
for index, item in enumerate(creatoor):
creatoor[index] = str.strip(item)
return creatoor
#ジャンル
def get_genre(art):
genre: list[str] = art ["genre"].split["「」"]
for index, item in enumerate(genre):
genre [index] = str.strip(item)
return genre
#メインキャラ紹介
def get_char_acter(art):
char_acter: list[str] = art ["character"].split["\","・"]
for index, item in enumerate(char_acter):
char_acter [index] = str.strip(item)
return char_acter
}
結果(アニメ)
anime_regular.json
{"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【声の出演】細谷佳正、斎藤志郎、安元洋貴、森なな子、木下浩之、浦山迅、宮崎敦吉、河本邦弘、山岸治雄、ニケライファラナーゼ、丸田光、COMA-CHI", "originalWorkCreator": null, "originalWorkName": null, "datePublished": null, "creator": null, "image": null, "genre": null, "track": "【音楽】mabanua(origamiPRODUCTIONS)【エンディング曲】NakamuraEmi「かかってこいよ」(日本コロムビア)", "source": null, "seriesName": null, "productionCompany": null, "character": null, "rdf-schemalabel": null, "publisher": null, "alternateName": null, "name": null, "language": null, "brand": null, "popularity": null, "keyword": null, "isSeries": null, "readTime": null, "isR15": null, "isBl": null, "isGl": null, "isR18g": null, "evPoint": null, "details": null}, {"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【声の出演】中井和哉、鈴村健一、興津和幸、関智一、悠木碧、小西克幸、Lynn、河西健吾、田村睦心、小松奈生子、飯田友子、河村梨恵、金子誠【出演】梶原岳人、小林裕介、三上枝織、橋詰知久", "originalWorkCreator": null, "originalWorkName": null, "datePublished": null, "creator": null, "image": null, "genre": null, "track": "【音楽】末廣健一郎【エンディング曲】須田景凪「veil」(unBORDE)", "source": null, "seriesName": null, "productionCompany": null, "character": null, "rdf-schemalabel": null, "publisher": null, "alternateName": null, "name": null, "language": null, "brand": null, "popularity": null, "keyword": null, "isSeries": null, "readTime": null, "isR15": null, "isBl": null, "isGl": null, "isR18g": null, "evPoint": null, "details": null}, {"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【声の出演】野沢雅子、佐藤正治、堀川りょう、田中真弓、古川登志夫、緑川光、中原茂、伊藤美紀、太田真一郎、山寺宏一、森田成一、こおろぎさとみ、高塚正也、沼田祐介、島田敏、小山剛志、竹本英史、ゆかな、白石涼子、織田優成、田中秀幸、高戸靖広、龍田直樹", "originalWorkCreator": null, "originalWorkName": null, "datePublished": null, "creator": null, "image": null, "genre": null, "track": "【音楽】住友紀人【エンディング曲】ロットングラフティー「70cm四方の窓辺」(ビクターエンタテインメント)", "source": null, "seriesName": null, "productionCompany": null, "character": null, "rdf-schemalabel": null, "publisher": null, "alternateName": null, "name": null, "language": null, "brand": null, "popularity": null, "keyword": null, "isSeries": null, "readTime": null, "isR15": null, "isBl": null, "isGl": null, "isR18g": null, "evPoint": null, "details": null}, {"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【出演】のだこころ、堀内まり菜、ケイン鈴木、岡本祐一郎【声の出演】佐藤はな、松本健太、宮本佳那子【出演】ルミコバーンズ、高村佳偉人、兵頭秀明、國松寿理、小川花怜", "originalWorkCreator": null, "originalWorkName": null, "datePublished": null, "creator": null, "image": null, "genre": null, "track": null, "source": null, "seriesName": null, "productionCompany": null, "character": null, "rdf-schemalabel": null, "publisher": null, "alternateName": null, "name": null, "language": null, "brand": null, "popularity": null, "keyword": null, "isSeries": null, "readTime": null, "isR15": null, "isBl": null, "isGl": null, "isR18g": null, "evPoint": null, "details": null}, {"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【声の出演】水野麻里絵、小山力也、齋藤彩夏、森嶋秀太、佐々木未来、橘田いずみ、蒼井翔太、黒田崇矢、三瓶由布子、水島大宙、箭内仁、志田有彩", "originalWorkCreator": null, "originalWorkName": null, "datePublished": null, "creator": null, "image": null, "genre": null, "track": "【エンディング曲】Poppin’Party(戸山香澄(CV愛美)、花園たえ(CV大塚紗英)、牛込りみ(CV西本りみ)、山吹沙綾(CV大橋彩香)、市ヶ谷有咲(CV伊藤彩沙))「B.O.F」(ブシロードミュージック)", "source": null, "seriesName": null, "productionCompany": null, "character": null, "rdf-schemalabel": null, "publisher": null, "alternateName": null, "name": null, "language": null, "brand": null, "popularity": null, "keyword": null, "isSeries": null, "readTime": null, "isR15": null, "isBl": null, "isGl": null, "isR18g": null, "evPoint": null, "details": null}, {"type": "anime", "isPartOf": null, "startDate": null, "relatedItemName": null, "keywords": null, "actor": "【声の出演】田村睦心、河本啓佑、茜屋日海夏、中小路雅海、花倉洸幸、峯田大夢、津田美波、関根明良、茅野愛衣、高田紗希衣", "originalWorkCreator":
}
メディア芸術データベース(映画)
anime_movie.py
from util import load_json, write_json
import datetime
import re
input_path = "./input/anime_movie.json"
output_path = "./output/anime_movie.json"
def main():
# input_pathを読み取る
input = load_json(input_path)
output = []
# 前処理
for art in input:
row = {
"type": "anime-movie",
}
row["startYear"] = get_start_year(art)
row["relatedItemName"] = get_related_item_name(art)
row["actor"] = get_actor_item_name(art)
row["originalWorkCreator"] = get_originalg_Work_Creator(art)
row["originalWorkName"] = get_original_Work_Name(art)
row["datePublished"] = get_date_Pub_lished(art)
row["creator"] = get_creatoor(art)
row["productionCompany"] = get_productio_Company
output.append(row)
# output_pathに書き出す
write_json(output_path, output)
#開始年月
def get_start_year(art):
if "startDate" not in art or art["startDate"] is None:
return None
date = datetime.datetime.strptime(art["startDate"], "%Y-%m-%d")
return date.year
#関連作品
def get_related_item_name(art):
if "relatedItemName" not in art:
return None
related_item_names :list[str] = art["relatedItemName"].split("/")
for index, item in enumerate(related_item_names):
related_item_names[index] = str.strip(item)
return related_item_names
#原作者名
def get_originalg_Work_Creator(art):
if art ["originalWorkCreator"] is None:
return None
originalg_Work_Creator : list[str] = re.split(r"/|\[|\]", art ["originalWorkCreator"])
for index, item in enumerate(originalg_Work_Creator):
originalg_Work_Creator[index] = str.strip(item)
return originalg_Work_Creator
#キャスト名
def get_actor_item_name(art):
if art["actor"] is None:
return None
# actor_item_names = art["actor"].split("/","【】")
actor_item_names = re.split(r"/|【|】", art["actor"])
for index, item in enumerate(actor_item_names):
actor_item_names[index] = str.strip(item)
return actor_item_names
#原作名
def get_original_Work_Name(art):
if "original_Work_Name" not in art:
return None
original_Work_Name : list[str] = art ["original_Work_Name"].split("/","【】")
for index, item in enumerate(original_Work_Name):
original_Work_Name[index] = str.strip(item)
return original_Work_Name
#公開年月日
def get_date_Pub_lished(art):
if "datePublished" not in art or art["datePublished"] is None:
return None
date = datetime.datetime.strptime(art["datePublished"], "%Y-%m-%d")
return date.year
#サムネイル
def get_image_item_name(art):
image_item_names : list[str] = art ["image"].split("/","[]")
for index, item in enumerate(image_item_names):
image_item_names[index] = str.strip(item)
return image_item_names
#ジャンル
def get_genre_item_name(art):
genre_item_names : list[str] = art ["genre"].split("")
for index, item in enumerate(genre_item_names):
genre_item_names[index] = str.strip(item)
return genre_item_names
#楽曲
def get_track_item_name(art):
track_item_names : list[str] = art ["track"].split("/")
for index, item in enumerate(track_item_names):
track_item_names[index] = str.strip(item)
return track_item_names
#データ出典
def get_source_item_names(art):
source_item_names : list[str] = art ["source"].split("()","、")
for index, item in enumerate(source_item_names):
source_item_names[index] = str.strip(item)
return source_item_names
#制作者名
def get_productio_Company(art):
productio_Company : list[str] = art ["productio_Company"].split("[]")
for index, item in enumerate(productio_Company):
productio_Company[index] = str.strip(item)
return productio_Company
#作者
def get_creatoor(art):
if art["creator"] is None:
return None
creatoor: list[str] = art ["creator"].split("[]")
for index, item in enumerate(creatoor):
creatoor[index] = str.strip(item)
return creatoor
}
結果(映画)
anime_movie.json
[
{
"type": "anime",
"isPartOf": null,
"startDate": null,
"relatedItemName": null,
"keywords": null,
"actor": "【オリヴァー・マイ】石川英郎 / 【モニク・キャディラック】長沢美樹 / [キャスト]ほか",
"originalWorkCreator": null,
"originalWorkName": null,
"datePublished": null,
"creator": null,
"image": null,
"genre": null,
"track": null,
"source": null,
"seriesName": null,
"productionCompany": null,
"character": null,
"rdf-schemalabel": null,
"alternateName": null,
"identifier": null,
"contributor": null,
"language": null,
"brand": null,
"popularity": null,
"keyword": null,
"isSeries": null,
"readTime": null,
"isR15": null,
"isBl": null,
"isGl": null,
"isR18g": null,
"evPoint": null,
"details": null
},
{
"type": "anime",
"isPartOf": null,
"startDate": "1941-02-19",
"relatedItemName": null,
"keywords": null,
"actor": null,
"originalWorkCreator": null,
"originalWorkName": null,
"datePublished": "1941-02-19",
"creator": "[演出]鈴木宏昌 / 古沢秀雄",
"image": null,
"genre": "アニメ映画シリーズ",
"track": null,
"source": "日本動画協会調べ",
"seriesName": null,
"productionCompany": "關東配電 / 國光教育映画社[提供] / 宏昌漫画映画製作所",
"character": null,
"rdf-schemalabel": null,
"alternateName": null,
"identifier": "C409342",
"contributor": null,
"language": null,
"brand": null,
"popularity": null,
"keyword": null,
"isSeries": null,
"readTime": null,
"isR15": null,
"isBl": null,
"isGl": null,
"isR18g": null,
"evPoint": null,
"details": null
},
{
"type": "anime",
"isPartOf": null,
"startDate": null,
"relatedItemName": null,
"keywords": null,
"actor": null,
"originalWorkCreator": null,
"originalWorkName": null,
"datePublished": null,
"creator": null,
"image": null,
"genre": "アニメ映画シリーズ",
"track": null,
"source": "日本動画協会調べ",
"seriesName": null,
"productionCompany": "大藤信郎",
"character": null,
"rdf-schemalabel": null,
"alternateName": null,
"identifier": "C409344",
"contributor": null,
"language": null,
"brand": null,
"popularity": null,
"keyword": null,
"isSeries": null,
"readTime": null,
"isR15": null,
"isBl": null,
"isGl": null,
"isR18g": null,
"evPoint": null,
"details": null
},
{
"type": "anime",
"isPartOf": null,
"startDate": "1941-01-01",
"relatedItemName": null,
"keywords": null,
"actor": null,
"originalWorkCreator": null,
"originalWorkName": null,
"datePublished": "1941-01-01",
"creator": "千葉洋路",
"image": null,
"genre": "アニメ映画シリーズ",
"track": null,
"source": "日本動画協会調べ",
"seriesName": null,
"productionCompany": "佐藤映画製作所 / 佐藤吟次郎",
"character": null,
"rdf-schemalabel": null,
"alternateName": null,
"identifier": "C409346",
"contributor": null,
"language": null,
"brand": null,
"popularity": null,
"keyword": null,
"isSeries": null,
"readTime": null,
"isR15": null,
"isBl": null,
"isGl": null,
"isR18g": null,
"evPoint": null,
"details": null
},
}
メディア芸術データベース(漫画)
comic_magazine.json
from util import load_json, write_json
import datetime
#マガジン
input_path = "./input/comic_magazine.json"
output_path = "./output/comic_magazine.json"
def main():
# input_pathを読み取る
input = load_json(input_path)
output = []
# 前処理
for art in input:
row = {
"type": "comic-magazi.json",
}
row ["genre"] = get_genre(art)
row ["description"] = get_descr_iption(art)
row ["name"] = get_name(art)
row ["genre"] = get_genre(art)
row ["description"] = get_descr_iption(art)
row["originalWorkCreator"] = get_original_Work_Creator(art)
row ["name"] = get_name(art)
row ["publisher"] = get_publisher(art)
output.append(row)
# output_pathに書き出す
write_json(output_path)
#概要
def get_descr_iption(art):
description :list[str] = art["description"].split("/")
for index, item in enumerate(description):
description[index] = str.strip(item)
return description
#ジャンル
def get_genre(art):
genre :list[str] = art["genre"].split("[]","@","language","value")
for index, item in enumerate(genre):
genre[index] = str.strip(item)
return genre
#タイトル
def get_name(art):
name:list[str] = art["name"].split("@language","@value","{}","[]")
for index, item in enumerate(name):
name[index] = str.strip(item)
return name
#原作者名
def get_original_Work_Creator(art):
originalWorkCreator:list[str] = art["originalWorkCreator"].split("[]")
for index, item in enumerate(originalWorkCreator):
originalWorkCreator[index] = str.strip(item)
return originalWorkCreator
#発行者
def get_publisher(art):
publisher:list[str] = art["publisher"].split(",")
for index, item in enumerate(publisher):
publisher[index] = str.strip(item)
return publisher
}
結果(漫画)
comic_magzine.json
[
{
"genre": "マンガ雑誌",
"description": null,
"keywords": null,
"originalWorkCreator": null,
"creator": null,
"image": null,
"name": [
"斬鬼",
{
"@language": "ja-hrkt",
"@value": "ザンキ"
}
],
"seriesName": null,
"contributor": null,
"issueNumberPublished": null,
"volumeNumberFinal": null,
"isPartOf": null
},
{
"genre": "マンガ雑誌",
"description": null,
"keywords": null,
"originalWorkCreator": null,
"creator": null,
"image": null,
"name": [
"月刊少年ジャンプ 週刊ヤングジャンプ共同編集 弓月光ジャンプSPECIAL",
{
"@language": "ja-hrkt",
"@value": "ゲッカンショウネンジャンプシュウカンヤングジャンプキョウドウヘンシュウユヅキヒカルスジャンプペシャル"
}
],
"seriesName": null,
"contributor": null,
"issueNumberPublished": null,
"volumeNumberFinal": null,
"isPartOf": null
},
{
"genre": "マンガ雑誌",
"description": null,
"keywords": null,
"originalWorkCreator": null,
"creator": null,
"image": null,
"name": [
{
"@language": "ja-hrkt",
"@value": "ヤングユースペシャル,Young you special"
},
"YOUNG YOU Special"
],
"seriesName": null,
"contributor": null,
"issueNumberPublished": null,
"volumeNumberFinal": null,
"isPartOf": null
},
}
これで書いたAIPが呼び出され、Jsonに保存できた。
最後に
卒業研究という機会の中で上記のような作業を行いました。
その中で、見やすくメモすること、やったことをしっかりとメモすることが大切だと思ました。
Spotifyは、情報を取得する際に取得数に制限があり私には、どうしようもありませんでした
あとSpotifyは取得するためにSpotifyにログインしてクライアントIDを取得しないと取得できなっかったのが面倒くさかったです。
Discussion