nokogiriを使ってYouku(soku)から動画idと再生時間を取得してみた

動画の情報を自動で収集できたら良いなと思い、最近は動画の情報収集に勤しんでいます。

前回、Youtubeの動画IDと再生時間などの情報はAPIを使用して取得しました。

ただYoutubeだけではありきたりな動画しか集まらないのでは、と思いました。

そこで中国のYoutubeと言われるYoukuの動画の情報をRubyを使って取得しました。

YoukuにもAPIがあるようですが中国語が読めず開発用のキーの発行ができなかったので、今回はnokogiriでHTMLから情報を取得します。

Youkuはキーワード検索を行うと、何故か一度sokuというサイトで検索をします。

検索結果から動画を選ぶと、Youkuに戻るという謎設計になっていたので実際に行うのはsokuのHTMLからの情報取得となります。

sokuのURLについて

sokuの検索する際のURLは以下のようになっています。

http://www.soku.com/search_video/q_○○

○○に検索するキーワードが入ります。
「ハルチカ op」などで検索する場合も、sokuではスペースのままでした。(Youtubeでは+でつなげます)

keyword    = "春太与千夏的青春 op"
search_url = "http://www.soku.com/search_video/q_"+keyword
search_url = URI.escape(search_url)

keywordは検索のキーワードで、ハルチカは中国語で「春太与千夏的青春」(違う書き方もあるそうですが)と書くらしいのでこうしました。

search_urlでアクセスするURLを作成し、URI.escapeで日本語や中国などに対応させます。

charset    = nil
user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'

html = open(search_url, "User-Agent" => user_agent) do |f|
  charset = f.charset    #文字コードを取得
  f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)

open-uriを使用してHTMLとサイトの文字コードを取得します。

HTMLとサイトの文字コードを使い、変数docにNokogiriでパースされた情報を渡します。

続きを読む

YouTube Data API v3の検索をRubyで触ってみた②

前回に引き続きYouTube Data API v3について書いていきます。

URLを直に各方法について

YouTubeのキーワード検索をしたいので、以下のURLにキーワードを追加や検索動画の件数の情報を追加していきます。

https://www.googleapis.com/youtube/v3/search

上記のURLに最低限追加しなくてはいけないものが3つあります。

追加するもの 内容
q 検索キーワード
key 開発用の鍵(Developer key)
part プロパティ指定
https://www.googleapis.com/youtube/v3/search?part=snippet&q=○○&key=○○

このようなURLにアクセスすると検索結果のjsonが取得できます。

アクセス方法は、open-uriを使う方法を使いました。

まだ件数を指定していないため、アクセスして取得される動画は5件になっています。

取得する動画の件数の指定は、maxResultsを追加して行います。
他の方のブログなどを参考にすると、50件が最大らしいです。

https://www.googleapis.com/youtube/v3/search?part=snippet&q=○○&key=○○&maxResults=10

このようにすると、10件の検索結果が取得できます。

アクセス例は以下のように

require 'open-uri'
require 'json'
url = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=○○&key=○○&maxResults=10"
res = open(url)
result = res.read
youtube_data = JSON.parse(result)

取得できたjsonの中身は以下のようになっています。(上記のコードのresultの中身です)

f:id:crossfabricate:20160331214551p:plain

上記の図から、kind,etag,nextPageToken,regionCode,pageInfo,itemsという配列があることが分かります。

そして動画の検索結果に関しては、itemsという配列の中にあります。

動画の個別のidはitemsのidのvideoIdに書いてあるので以下のように書くと、検索結果の最初の動画のidが取得できます

youtube_data.first["items"]["id]["videoId"]

取得できたidは以下のurlに追加すると、動画のページにアクセスすることができます。

https://www.youtube.com/watch?v=○○

(追伸)
jsonを表示した画像に手違いがあり、それを参考に記述した記事の一部及び画像を変更しました(2016年3月31日)

YouTube Data API v3の検索をRubyで触ってみた①

APIでデータを集めるコンテンツを作成したいと思い、YoutubeのAPIに触ってみました。

GoogleDevelopersのRubyのサンプルコードを実際に実行してみても動かなかったので、その理由を調べてみました。

YouTube Data API v3の使い方には2つの方法があるようです。(他の方法もあるかもしれませんが)

1つ目は、GoogleDevelopersのサンプルにも書いてある方法で、「google-api-client」というgemを使う方法です。
2つ目は、URLを直に書いてしまう方法です。

どちらを使うにしてもDEVELOPER_KEYが必要です。

続きを読む

グラフを動かすサイト「TouchGraph」を公開

以前、Flotr2のクリック周りについて触りました。
Flotr2のクリック処理周りを使ってみた - crossfabricateのブログ


そのときにグラフを触って動かせるサイトがあると、楽しそうだなと思いグラフをマウスで動かせるサイトを作ってみました!
TouchGraph

グラフは以下のように移動させることができます。

f:id:crossfabricate:20160319000314g:plain

動きに関してはマウスを上下左右にクリックした状態で動かすことでグラフを移動させることが出来ます。
数式は自分で入力することができるので、色々なグラフを触ることができます。(f(x)の式限定)
今回は、文字列の数式を計算しているのはJavaScriptのevalという関数です。
そのため、evalの許容範囲外の式は正しく描画することはできません。

f:id:crossfabricate:20160319000304g:plain

pow(x,2)の移動ではxが0の時に変な動きが時々でますが、現在はご愛嬌ということで!

f:id:crossfabricate:20160319000316g:plain

移動だけでなく、式の変形などもすることができます。

少し前に勉強した正規表現なども使って、入力された式を変形させたりしたので色々と勉強になりました。

Flotr2のクリック処理周りを使ってみた

Web上でのグラフをやってみたいと思い、Flotr2を使ってみることにしました。

式を描画するだけだとexampleと同じなので、折角ならスワイプで式を上下左右に動かせると良いなと思い、クリック周りを調べて見ることにしました。

Flotr2では、クリック処理は以下のように書くと実装できました。

Flotr.EventAdapter.observe(container, 'flotr:click', function(position) {
    //クリック処理
    alert("X:"+position.x+" Y:"+position.y);
});

Flotr.EventAdapter.observe関数の第二引数『'flotr:click'』がクリックであることを指している部分です。

ただ私が使いたいのはクリックではなくスワイプの処理なので、『click』ではなく『mouseup』や『mousedown』、『mousemove』です。

探してみると以下のような形で、『mousedown』がありました。

Flotr.EventAdapter.observe(container, 'flotr:mousedown', function(event) {
    //mousedown処理
});

第三引数のfunctionの中がeventでpositionではないのです。(eventの中はしっかり見ていないので、まだ分かりません)

positionではないということでpositionの入手は出来ませんでした、『mousedown』と『mousemove』を見てみると『mousemove』はpositionが取得できました。

そのため、『mousedown』と『mouseup』のタイミングで『mousemove』の座標を保存することで、スワイプを実装しました。

第二引数と第三引数の対応を表にします。

第二引数 第三引数
flotr:click function(position)
flotr:mousedown function(event)
flotr:mouseup function(event)
flotr:mousemove function(e,position)

このような関係になっていました。

画像のURL抽出を通して正規表現を勉強してみた

今まで正規表現というものに対して、ネットのコピペでやり過ごしていました。
ただそれでは流石にまずいな、と思い勉強をしてみました。

何か目的がないと作っていても楽しくないので、rubyで画像を収集するクローラーっぽいものを作ることにしました。
今回は、画像のURLを取得した正規表現周りのみについて書きます。

画像の行を探す

まずは、指定したURLのページのソースを一行ずつ読み込み、画像(jpeg,jpg,png,gif)についての記述があるか正規表現で探しました。

line = line.match( /.+(jpeg|jpg|png|gif).+/ )

lineには、ページのソースの一行が入っているとします。

正規表現の構文(以下のURL)を参考にすると
https://msdn.microsoft.com/ja-jp/library/cc392020.aspx
「.」は、任意の一文字
「+」は、直前のサブ式(今回は文字と考えて問題ありません)を1回以上繰り返す
「x|y」は、xまたはyに一致する

つまり「何かしらの文字を繰り返した後に、画像の拡張子があり、再び文字が繰り返す」というものです。
これで画像があるソースの行の取得ができました。

続きを読む

coco2d-xのstd::stoi以外での文字から数字の変換

cocos2d-xで文字から数字に変えるのにstd::stoiが使えず、少し困ったことがありました。
Application.mkを書き換えるとstd::stoiが使えるという記事もあったのですが、自分はApplication.mkを書き換えるとビルドが出来なくなってしまいました。(調べれば、この方法もきちんと実行できると思います)
そのため力技な気もしますが特別な設定をしなくても、文字から数字に変更する方法を紹介します。

std::string word = "10";
auto tmp = Value(word);
int number = tmp.asInt();

std::stringをValue型に一度変換して、さらにasInt()でintにするという二度手間ですが一応変換することができました。
Application.mkを書き換えが面倒な方は使ってみてください。

(実行環境)
cocos2d-x v3.6