Python

なろうAPIをPython3で使いながらAPIを使う勉強[#1]<小説家になろう>

こんにちは,しまさん(@nitkcdadon)です.

「小説家になろう」ご存知でしょうか.

いわゆる小説投稿サイトで,CGMのひとつです.

私は玉石混交の中から面白い作品を見つけるのが好きで最近よく利用しています.

最近はなろう原作のアニメが放映されたりと認知度が上がっているのではないでしょうか.

そんな「小説家になろう」ですがAPIを公開しています.

なろう小説APIを用いれば小説家になろうに掲載されている小説情報を取得することができます.

私のPythonの学習とAPIの使い方を学ぶためにこのなろうAPIを有効活用させてもらいたいと思います.

環境

macOS 10.14 (Mojave)

pyenv Python3.6.7

スポンサーリンク

なろうAPI

なろうAPIについては以下のサイトで確認することができます.

サンプルプログラムはありますがもちろん?Pythonのコードはありません.

なろうAPIはHTTPでのリクエストに対してJSON形式,JSONP形式又はYAML形式,PHPのserializeで応答します.

IPアドレスごとに利用制限があるので注意が必要です.

1日の利用上限は80,000または転送量上限400MBとなっています.

スポンサーリンク

さっそくPythonでAPIを使ってみる

基本は「https://api.syosetu.com/novelapi/api/」に対してGETで送信します.

転送量の制限を考えgzip圧縮するパラメータを設定し,受け取ってからこちら側で処理することにします.

<コード>

import json
import requests
import gzip

url = "http://api.syosetu.com/novelapi/api/?out=json&gzip=5"

#Responce オブジェクトを生成
response = requests.get(url)

#エンコーディングを指定する
response.encoding = 'gzip'

# デコードされていないレスポンスの内容(バイト列)
r = response.content

# gzipの展開,UTF-8
res_content = gzip.decompress(r).decode("utf-8")

# JSONのデコーディング
response_json = json.loads(res_content)

print(response_json)

<出力>

[{'allcount': 623184}, {'title': '恋 と パンツ と バイオリン\u3000~あの素晴らしい調べをもう一度~', 'ncode': 'N5275FD', 'userid': 330068, 'writer': 'シャイン樽画', 'story': '\u3000中学二年の後藤・清美≪ごとう・きよみ≫は、ジュニア・オーケストラに所属するバイオリン少女。\n\u3000だが、所属しているオケ(オーケストラ)からは、\n\u3000音楽性の違いで、すっかり浮いた存在になってしまっていた……\n\u3000\n\u3000音楽や合奏を、純粋に楽しみたい清美は、\n\u3000ただプロへの通過点としてオケに所属している他のメンバーと気が合わないのだ……\n\u3000\n\u3000おまけに勘違い野郎のイケメンくん・新井和人には、\n\u3000何故だか変に気に入られ(?)何かと突っかかって来られ……\n\u3000\u3000\n\u3000そして更には……\n\u3000そんな和人にちょっかい出されている清美のことを\n\u3000和人のファンである女子メンバー達は、よく思わず……\n\u3000ついに嫌がらせが始まってしまう――\n\u3000\n 「もう限界だ……」\n\u3000\n\u3000元から気が合わないメンバーばかりのオケに辟易していた清美だが、\n\u3000その嫌がらせをきっかけに、\n\u3000ついに、オケを辞めることになり……\n\u3000\n\u3000だが……?\n\u3000\n「辞めるなんて許さねえぞ!?」\n\u3000\n\u3000清美がオケを辞めることを止めようと、\n\u3000和人は、清美に壁ドンを仕掛け、そして無理やり彼女の唇を……!?\u3000\n\u3000\n■\u3000■\u3000■\u3000■\u3000■\u3000■\u3000■\n\n\u3000バイオリン歴20年以上の作者が送る\n\u3000バイオリンを巡る、ちょっぴり切ない青春ラブストーリー!\n\u3000ここにスタートいたします!\n\n\u3000なお、たぶん毎土日投稿の不定期連載(ヲイヲイ)', 'biggenre': 1, 'genre': 102, 'gensaku': '', 'keyword': 'R15 スクールラブ 青春 ラブコメ 残念な描写あり すれ違い バイオリン 部活動 中学生 パンツから始まる恋 悲恋(?) 腹黒メガネ 土日掲載', 'general_firstup': '2018-11-25 06:00:00', 'general_lastup': '2019-01-12 22:13:56', 'novel_type': 1, 'end': 1, 'general_all_no': 26, 'length': 83156, 'time': 167, 'isstop': 0, 'isr15': 1, 'isbl': 0, 'isgl': 0, 'iszankoku': 0, 'istensei': 0, 'istenni': 0, 'pc_or_k': 2, 'global_point': 44, 'fav_novel_cnt': 7, 'review_cnt': 0, 'all_point': 30, 'all_hyoka_cnt': 3, 'sasie_cnt': 0, 'kaiwaritu': 17, 'novelupdated_at': '2019-01-12 22:13:56', 'updated_at': '2019-01-12 22:16:18'}, 

以下20件表示される.

out=jsonで出力をJSON形式に指定しています.

gzip=5はなろうAPIで用意されているgzipによる圧縮で一番圧縮されるオプションになります.

今回は何もそれ以外に指定していないので新着更新順で20件表示されることになります.

パラメータを見てみる

簡単にパラメータとその内容をまとめておきます.

詳しいものはAPIの仕様を見てみてください.

少しずつコードを動かして試していきます.

url = "http://api.syosetu.com/novelapi/api/?out=json&gzip=5"

先程の<コード>のurl部分を変えていきます.

パラメータ内容
of出力する項目を指定
lim最大出力数を指定(デフォルトは20)
指定できる範囲は1~500
order出力順序を指定(デフォルトは新着更新順)

new 新着更新順
favnovelcnt ブックマーク数の多い順
reviewcnt レビュー数の多い順
hyoka 総合ポイントの高い順
hyokaasc 総合ポイントの低い順
impressioncnt 感想の多い順
hyokacnt 評価者数の多い順
hyokacntasc 評価者数の少ない順
weekly 週間ユニークユーザの多い順
毎週火曜日早朝リセット
(前週の日曜日から土曜日分)
lengthdesc 小説本文の文字数が多い順
lengthasc 小説本文の文字数が少ない順
ncodedesc 新着投稿順
old 更新が古い順

url = "http://api.syosetu.com/novelapi/api/?out=json&gzip=5&lim=1&order=old"

<出力>

[{'allcount': 623355}, {'title': '総合調査会社アジディックファイル1ジャッジメント', 'ncode': 'N0037A', 'userid': 4, 'writer': '電光石火スパイラル', 'story': 'アジディック社長岩国神奈が、彼氏赤星拓真とのスキーツアーを計画。ひょんな事から総勢十五名もの大ツアーに。二週間の日程の八日目から猛吹雪に。山荘スノードロップに十五人が取り残される。その夜神奈のコテージから生首発見。胴体は密室状態の主のコテージから発見される。いたずらに時が過ぎその間に被害者の数は9名に。最後は、犯人ジャッジメントが遺書を残して首を吊ったという結末に疑問を持ったルポライターが書いたドキュメンタリーを手掛かりに事件を捜査した四人の探偵が再び捜査に乗り出す。描かれたヒントを元に探偵達が辿り着いた犯人との激しいディスカッションの末逮捕までこぎ着ける。', 'biggenre': 98, 'genre': 9801, 'gensaku': '', 'keyword': 'ジャッジメント', 'general_firstup': '2004-04-20 01:51:31', 'general_lastup': '2004-05-01 11:49:57', 'novel_type': 1, 'end': 1, 'general_all_no': 3, 'length': 1329, 'time': 3, 'isstop': 1, 'isr15': 0, 'isbl': 0, 'isgl': 0, 'iszankoku': 0, 'istensei': 0, 'istenni': 0, 'pc_or_k': 0, 'global_point': 294, 'fav_novel_cnt': 42, 'review_cnt': 6, 'all_point': 210, 'all_hyoka_cnt': 21, 'sasie_cnt': 0, 'kaiwaritu': 14, 'novelupdated_at': '2009-09-30 10:02:17', 'updated_at': '2019-01-04 04:04:03'}]

最も古いものから1つ取り出すコードです.

ここから分かるように小説家になろうに現存している中で最古のものは2004年のものなのですね.

もう15年前も前.

スポンサーリンク

さいごに

今回は簡単なパラメータ設定をしてのGETを扱いましたが

次回は条件抽出をやっていきたいと思います.

p.s.

15年前からこういうサービスがあったというのは驚きでした.

[入門]Python初心者が圧倒的成長するために使うサービス,本Python初心者向けの本,Webサービスについて網羅的に紹介をしています.Pythonの勉強で私が実際に使用した本です.入門書をさらに細分化し,学ぶならどのレベルがいいのかわかりやすくしています....
ABOUT ME
しまさん
てくてくぷれいす運営者のしまさんです. 高専→大学編入してから行動的な大学生  自身の変化を求めてブログを始める グレープフルーツと本が大好物 IT系のことやブログ,高専や編入,大学生活に関することを発信中!!詳しいプロフィールはこちら≫ 投げ銭はコチラへ 質問はコチラ