接着剤の精進日記

競プロでの精進や研究に関係したことを書いていきます。

Pythonでニコニコ動画をスクレイピングしてまとめてみた。

はじめに

完全に趣味用だが、ニコニコ動画スクレイピングしてみた。
内容としては、昨日一日で投稿された動画の一覧を取得し、
タイトル(動画への直リン付き)とサムネイルを表示するというものだ。
以下の画像のようなサイトとなっている。

f:id:tkm-kyudo:20171122000803p:plainf:id:tkm-kyudo:20171122000806p:plain
琴葉姉妹動画なのは趣味です。
せっかく作ったので、簡単に説明してみる。
コードの説明とかは需要あったら書くかも。

簡単に構造の説明

まず、ディレクトリの関係としては、

--index.html
 |-akane_aoi-2017-11-21.html...
 |                 
 |-honobono-2017.11.21.html...
 |           
 ...    
 |
  -img

のようになっている。
index.htmlの存在する階層にそれぞれの検索ワードのディレクトリがある。
また、そのティレクトリに日付で名前のつけたhtmlファイルが存在している。
imgディレクトリには動画のサムネイル画像が入っている。

index.html

index.htmlでは検索ワードごとの最新ページへとリンクしている。
また、スクレイピングのコードを実行するごとに最新版へリンクを更新するようにしている。

各htmlファイル

各htmlファイルは各検索ワードごとに最新の検索結果を取得して表示している。
タイトルは、その動画の直リンク(http://www.nicovideo.jp/watch/sm*)、
サムネイルは、imgディレクトリに保存したものを参照して使用している。

API用パラメータの指定、検索ワードなどの用意

q = ""
targets = "targets=tags"
fields = "fields=contentId,title,description,startTime"
filters = "filters[startTime][gte]=" + str(yesterday) + \
"T00:00:00%2B09:00&filters[startTime][lt]=" + str(today) + \
"T00:00:00%2B09:00
&_sort=-viewCounter&_offset=0&_limit=100&_context=apiguide"

詳しい説明は先ほどのAPIガイド(http://site.nicovideo.jp/search-api-docs/snapshot.html)を
参照していただくとして、簡単な説明をする。
qは検索ワードで、パーセントエンコードしたもので指定する。
qについては次に説明する。
今回はタグ検索したものを取得したいのでtarget="targets=tagsとしている。
filtersのところは昨日から今日までに投稿された動画を、
再生数が高い順に100件取得するという指定をしている。
today,yesterdayにはdatetime型の値が入っている。

検索ワードのエンコード

qで指定する検索ワードのエンコードについては、以下のサイトを利用するか
URLエンコード・デコード|日本語URLをサクッと変換 | すぐに使える便利なWEBツール | Tech-Unlimited
もしくは、

import urllib.parse as parse
search_word = "琴葉茜・葵実況プレイ"
parse.quote(search_word)

のようにurllibparse.quoteを利用することで
パーセントエンコード(urlエンコード)できる。

APIの利用

上記のような手順で出来たurlが以下である(少々長いので便宜上改行している)。

http://api.search.nicovideo.jp/api/v2/snapshot/video/contents/search?
q=%E7%90%B4%E8%91%89%E8%8C%9C%E3%83%BB%E8%91%B5%E5%AE%9F%E6%B3%81%E3%83%97%E3%83%AC%E3%82%A4
&targets=tags&fields=contentId,title,description,startTime
&filters[startTime][gte]=2017-11-20T00:00:00%2B09:00&filters[startTime][lt]=2017-11-21T00:00:00%2B09:00
&_sort=-viewCounter&_offset=0&_limit=100&_context=apiguide

ここまでで、API用のURLにパラメータを指定してきた。
上述のURLにアクセスすることで検索結果のデータがjson形式で渡される。
そのjson形式のデータを上手く活用することで今回のhtmlが作成できた。

終わりに

今回は、思っていた以上に文字数がかかってしまったので、
作成したサイトの説明だけに留めた。
json形式のデータの扱いについては、次あたりに書く予定。
これでアカネチャンアオイチャンカワイイヤッターができる。