ニコニコ動画のサムネイルを一括ダウンロードするRubyスクリプト
ニコニコ動画には、動画のサムネイルと概要情報を小窓にして埋め込める機能がある。見た事がある人も多いだろう。
[サンプル]
今回、こういう埋め込みがたくさんあるページからこの画像だけ持ってくる作業を自動化した。実行環境は Ruby2.3.3 (やや古いが)、HTMLの解析にお馴染み nokogiri を使っている。
サムネイルの中身
小窓の正体は <iframe>
である。中身を覗くとこういうアドレスの埋め込みになっている。
https://ext.nicovideo.jp/thumb/sm3504435
これは普通のURLなので、やろうと思えばブラウザでアクセスできる(見た目は悪いが)。
さて、欲しい画像はこの中にある。つまり <iframe>
からこのアドレスだけ持ってきて、改めてアクセスする必要がある。やや荒いが
parser .xpath('//iframe') .map { |iframe| iframe.attribute('src').value } .select { |iframe_url| iframe_url.match %r(http://ext.nicovideo.jp/thumb/sm\d+) }
とした(他に <iframe>
があるとも限らんので)。
画像の特定
改めて http://ext.nicovideo.jp/thumb/sm\d+
の中身を見てみると、サムネイル画像のURLは
https://tn.smilevideo.jp/smile?i=3504435
となっていることが分かる(これで例のミクちゃんが見られるよ!)。普通の <img>
タグなので取得は簡単。
# URLの読み込み→Nokogiri は事前にやっておく→ thumb_parser thumb_img_src = thumb_parser.xpath('//img[@class="video_img"]').attribute('src').value
これで画像のURLが取得できる。
画像ダウンロード
ここまでやったんだから画像のダウンロードまで自動化したい。URLの画像データをローカルに保存するには open-uri を使う。 (Stackoverflow さんいつもありがとうございます)。画像ファイルの形式は一見分かりにくいが .jpg なので
open(thumb_img_src) do |image| file_id = thumb_img_src.scan(/\d+$/)[0] File.open("images/smile_#{file_id}.jpg", 'wb') do |file| file.puts(image.read) end end
とすれば images/
以下に画像がずらっとダウンロードされる。ヤッタ!
成果物
といったコードを書いたのでGistに公開した。
ここで題材として使わせてもらったのはこのブログ記事になる。
で、これで取ってきた画像をなんやかんやして
今年10周年を迎える2008年公開のボカロ曲まとめてみたらちょっとショックだったのでみなさんご査収ください pic.twitter.com/ce1BlGOhaI
— ねこばばおにいさん🤘 (@strviola) 2018年1月26日
の画像を作った訳ですよ!
まじかああああああもう10年(略
以上、いろんな意味で10年の歳月を実感する記事でした。