49-Excel VBAで取得してみる。
※2018年3月現在の情報です。試す人は最新情報を確認してください。
※Excel2016でやってます。PC推奨。
※プログラミングはPCのみです。スマートフォン版は現在はマクロ機能ありません。
WebAPIの取り方や、データ形式は分かりましたね。それではプログラムではどう取得するのかについて説明します。今回は皆さんになじみのあるExcelで説明します。Excelを持っている方は試してみてください。
スマホと携帯の人は読み飛ばすか、斜め読みでも結構です。この話はPC推奨です。
もし、他の言語を使える方はその言語でやってみてください。こだわる必要はありません。Excelを選んだのは、使用者数が多いからですね。でも他の言語は説明しません。『WebAPI <言語名>』で検索してください。
さて、今回はExcelを使いますよ。前半はプログラミングなしでの取得方法、後半はプログラミングで取得する方法です。ソースコードも一応おいておきます。ちなみに、詳細なプログラミング解説はしません。この関数はどうだとかまで言い始めると終わらないので、使う人は調べてから使ってください。
ExcelVBAは色々なサイトで使い方を解説されているので、興味が湧いた人はこの機会に勉強してみるといいでしょう。というわけで、まずはプログラミングなしで関数を使った取得の仕方です。
1. 『ExcelでプログラミングなしでWebAPIを取得する方法』
Excelには多くの関数が用意されており、WebAPI用の関数もあります。
それが『WEBSERVICE』関数です。使い方は『=WEBSERVICE("URL")』のように書きます。Web サービスからデータを返してくれます。URLの部分は前回説明したWebAPIのフォーマットを入力します。例を挙げると、
『=WEBSERVICE("https://api.syosetu.com/novelapi/api/?of=r-f-a-l&ncode=N5084EJ")』
例えばこれだとNコードN5084EJのレビュー数、ブクマ数、評価ポイント、文字数を返します。
もし、キーワードや除外キーワードを使う場合は、その部分をUTF-8にエンコードされた文字を入れる必要があります。そんな場合に使うのは『ENCODEURL』関数です。使い方は『=ENCODEURL("文字列")』のように書きます。URL用のUTF-8にエンコードされた文字列を返します。例を挙げると、
『=WEBSERVICE("https://api.syosetu.com/novelapi/api/?of=t-l-ka&lim=10&order=weekly&word=" & ENCODEURL("魔法"))』
例えばこれだと魔法のキーワードが入った作品を週間ユニークユーザーの多い順に並び替えて、上位10作品のタイトル、文字数、会話率を返します。
こんな感じで使います。これらの関数はExcel2013から使えます。それ以前のバージョンでは使えません。
また制約があって受け取れる文字数は32767文字です。それ以上の文字数が返ってきた場合はエラーになります。すべてのパラメータの取得だと20~50作品分ですかね。使う場合はofパラメータ指定かlim指定が必須です。
注意点ですけど、WEBSERVICE関数を入力したセルを別のセルにコピー&ペーストすると一斉にWEBSERVICE 関数が実行されます。なるべく単品で実行させるようにしてください。調子乗って100個くらいコピペすると大量のリクエストが同時に送られます。
ただ、一度実行された後は、明示的に再計算させない限りそのままです。関数の文字数とかを変えない場合は、他の関数のように都度再計算されません。なるべく負荷を抑えるような仕様になっているようです。
そのあたりに注意して使ってみてください。
2. 『Excel VBAでプログラミングしてWebAPIを取得する方法』
さてここからプログラミングです。あくまでも一例です。Excelを使わなくてもいいですし、他のやり方もいっぱいあります。プログラムが出来る人は多分他の言語でやる方がいいと思いますよ。
ではまずはExcelの準備です。プログラミングをするためにはいろいろな準備が必要です。それについてまず説明します。やる人は以下の手順でやってください。
まずツールバーの[ファイル] -> [オプション] -> [リボンのユーザー設定]のメインタブで開発にチェックを入れてください。(ついている人はそのまま)これでプログラム用のタブが出てきます。
次に開発タブの[VisualBasic]をクリック。VBE(Visual Basic Editor)を立ち上げてください。
次に標準モジュールを追加してそこに以下の宣言文を追加してください。
『Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)』(Sleepを使うためのものです。これで1秒以上の間隔を強制的にあけます)
最後にイミディエイトウィンドを立ち上げておいてください。
ということで準備が終わったんで、プログラミングします。
以下のコードを標準モジュールにコピぺしてください。'はコメント行です。
'********************************************
Sub SampleWebAPI()
Dim objXMLHttp As Object, strbuf As String
Sleep 1000'1秒待機。
Set objXMLHttp = CreateObject("MSXML2.XMLHTTP") 'Set
objXMLHttp.Open "GET", "https://api.syosetu.com/novelapi/api/?of=r-f-a-l&ncode=N5084EJ", False
'NコードN5084EJの小説のレビュー数、ブクマ数、評価数、文字数を取得する。
objXMLHttp.send '送信
strbuf = objXMLHttp.responseText 'APIの結果を変数に代入する
Debug.Print strbuf 'イミディエイトウィンドへの貼り付け
Set objXMLHttp = Nothing 'オブジェクトのクローズ
End Sub
'********************************************
これで、カーソルをSampleWebAPI関数内において、スタートボタンを押してください。もしくはF5キーを押す。
そうするとプログラムが実行されます。以下が実行結果ですね。こんな風にstrbufに結果が格納されています。これをシートに貼り付けたり、分離したりしてデータを集めます。
objXMLHttp.Open のURLを変えると自分の好きなデータが取れます。これを応用すれば番外編のようなデータ分析、解析が出来ちゃいますね。
ただ、気を付けてほしいのはSleep関数です。For文とかのループを入れる場合にはこれも必ず含んでください。プログラムによるリクエストは非常に高速です。そのため待ち時間を入れるのにSleep関数を使っています。これを外すと連続リクエストになるので、サーバーへの負荷が非常に大きくなります。なのでこれを外さないようにお願いします。
またこのファイルを保存する場合は拡張子をxlsmにしてください。そうでないとマクロの内容が消えます。
Excel VBAでWebAPIを使う場合はこんなかんじですね。色々と試してみてください。
◆ ◆ ◆
さて、これでとあるスコッパーの7章本編は終わりです。導入しか説明はしませんでしたが、いかがでしたか? またこの7章をもって、探し方の説明は終わりです。あとは番外編とエピローグだけです。
これまで、色々な探し方を紹介してきましたが、何か参考になることはありましたでしょうか。もし、一つでも参考になることがあったなら、幸いです。
サイトが大きくなり、投稿される小説の数が多くなるほど探すことは難しくなります。これは人気サイトにとって避けられないことなのです。ですが、幸いにも小説家になろうではいろいろな探し方が用意されています。ぜひ、あなたの好みの小説を探してみてください。




