ちょっとExcelでニコニコ動画のAPIを読み込みたいと思ったので、試してみました。
まずは、下記のようなシートを用意。
作りたいのは、A列の2行目以降に動画IDを書いて、その左側にその動画の情報を書き込んでいくというもの。
VBAはほとんど触ったことがないので、Rangeプロパティだとか、Offsetプロパティだとかの概念がよく分かってなかったのですが、なんとか作ることができました。
Sub nico()
Dim xdoc As Object
Dim url As String
Dim a_col As Range
Dim a_end As Integer
Set a_col = Range("A2", Range("A1").End(xlDown)) 'A列の動画IDをすべて選択
Set xdoc = CreateObject("MSXML2.DOMDocument")
xdoc.async = False
For Each cell In a_col
url = "http://ext.nicovideo.jp/api/getthumbinfo/" & cell.Value
If (xdoc.Load(url) = False) Then
MsgBox "アクセス失敗:" & cell.Offset(0, 0).Value
Exit Sub
End If
For Each obj In xdoc.DocumentElement.SelectNodes("//thumb")
cell.Offset(0, 1).Value = obj.SelectNodes("//title").Item(0).Text 'タイトル
cell.Offset(0, 2).Value = obj.SelectNodes("//thumbnail_url").Item(0).Text 'サムネイルURL
cell.Offset(0, 3).Value = obj.SelectNodes("//view_counter").Item(0).Text '再生数
cell.Offset(0, 4).Value = obj.SelectNodes("//comment_num").Item(0).Text 'コメント数
cell.Offset(0, 5).Value = obj.SelectNodes("//mylist_counter").Item(0).Text 'マイリスト数
If obj.SelectNodes("//user_id").Length = 1 Then
cell.Offset(0, 6).Value = obj.SelectNodes("//user_id").Item(0).Text 'ユーザーID
End If
If obj.SelectNodes("//tag[@category]").Length = 1 Then
cell.Offset(0, 7).Value = obj.SelectNodes("//tag[@category]").Item(0).Text 'カテゴリータグ
End If
Dim tag_i As Integer
tag_i = 1
For Each Tag In obj.SelectNodes("//tag")
cell.Offset(0, tag_i + 7).Value = Tag.Text 'タグ
tag_i = tag_i + 1
Next
Next
Next
Columns("B").AutoFit 'B列は自動的に幅調整
End Sub
XPathにはあまりなれてないのですが、属性で判断するカテゴリータグを取得したいということもあり、XPathを利用することに。
19行目で動画情報が取得できたかどうかの可否、25行目でユーザーIDがあるかどうかの可否、28行目でカテゴリータグがあるかどうかの可否を調べて条件分けしてます(動画情報が取得できたどうかは、If文じゃなくて、For Each文を使ってるので、間違ったつかいかたかもしれません)。
というわけで、実行してみました。
相変わらず、カテゴリーがうまく取得できていないところがありますが、他は問題なくいけたようです。
ありえない動画ID(この例では、sm1とaiueo)は動画情報を取得していませんし、ユーザーIDやカテゴリーも見つからなかったものは飛ばしているよう。数値のみの動画IDの動画情報もうまく取得できました。
今気づいたんですが、カテゴリータグってタグの一番目とは限らないんですね。てっきり、一番目なのかと・・・。ということは、カテゴリーが取得できない場合、一番目のタグを見て判断するという方法は使えないのか・・・。
ところで、自分が使ってるExcelはExcel2010なのですが、Excel2013だとWEBSERVICE関数なんていう便利なものがあるよう(参考:Excel 2013で追加された「WEBSERVICE」関数を使って、マクロを使わずWeb APIを利用する。 | 初心者備忘録)
何これ。すごい便利そう。
コメント