読者です 読者をやめる 読者になる 読者になる

nigoblog

スタートアップのCMOブログ

バイラルメディアはタイトルが9割!? タイトルとソーシャルの相関を見てみた【準備編】

バイラルメディアが最近流行ってきていますね。

2014年に新たな旋風を巻き起こす!?「バイラルメディア」が急成長する理由とは(柴田泰成) - 個人 - Yahoo!ニュース
いたるところでバイラルメディアが取り上げられています。

バイラルメディアとは

バイラルメディアについてですが、
1. コンテンツはタイトル + 動画の組み合わせ(が多い)
2. ソーシャルでバズることが最大の目的
3. 検索エンジンからの流入は目指さない
このような感じ。



バイラルメディア一覧

バイラルメディアの中でも有名なものを紹介していきます。

dropout

dropout – 刺さる動画メディア
社会問題や風刺などのコンテンツがメインのバイラルメディア

Whats

Whats(ワッツ) | 動画サイト
おもしろ動画や驚きの動画などがメインのバイラルメディア

animal buzz

animal buzz
動物動画などがメインのバイラルメディア

CuRAZY

CuRAZY | 笑うメディア
おもしろコンテンツがメイン。ただし動画に限らないところが他のバイラルメディアとは違うところ。

バイラルメディアが広まる流れ

1. 誰かが最初のシェアをする
2. 他の人がシェアされたコンテンツを見る
3. シェアされたコンテンツを見た人がまたシェアする
4. 2に戻る

2, 3の無限ループによって成り立つメディアと言えます。
ポイントはいかにループを止めないか。

最初にシェアした人のfacebook + twitterで見る人が Imp
それらを見てコンテンツを見る人の割合を CTR
コンテンツを見て再度シェアする人の割合を CVR
と考えるとわかりやすいかと思います。

Impはシェアする人に左右されるため、コンテンツでは制御しにくい部分があります。
となるとCTRをどれだけあげられるか、CVRをどれだけあげられるかが勝負になってきます。

結論からいうと
CTRを上げるにはタイトルの最適化
CVRを上げるにはコンテンツの最適化

コンテンツの最適化についてはどんなコンテンツを選ぶかがポイントです。
そして、良いコンテンツを選んだならば見られなければ意味がありません。
見られるためにはCTRを上げる必要がある。つまりどれだけタイトルを最適化できるか。
これこそが、本記事のタイトルバイラルメディアはタイトルが9割というものにつながります。

というわけでバイラルメディアのタイトルを分析してみます。

バイラルメディアのタイトル分析

まず外部から取得できる情報を考えます。
1. タイトル
2. facebookのいいね数
3. twitterでシェアされたカウント数
4. 動画の各情報

残念ながらimpとコンテンツのimp(CTR)は取ることができません。
なのでタイトルと相関のあるCTRが取れないのは残念ですが、ImpとCVRを固定として考えます。

バイラルメディアは
dropout – 刺さる動画メディア
を選択し、各情報を見ていきます。

それでは各情報をどうやって取っていくかを説明します。準備編ということで本記事ではこれがメインの内容です。

ちなみに参考にした記事はこれらの記事

youtube時間取得

デベロッパー ガイド: Data API プロトコル - 単独の動画情報の取得 - YouTube — Google Developers
XML処理 REXMLの使い方 - プログラムメモ

最初にどんなコードを書いたかを

require "open-uri"
require "rubygems"
require "nokogiri"
require "net/http"
require "json"

File.open("dropout.csv", "w"){|f|
  f.write "title, like, tweet, video_sec\n"
  for i in 1..10 do
    url = "http://dout.jp/page/#{i}"

    charset = nil 
    html = open(url) do |f| 
      charset = f.charset
      f.read
    end 

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

    doc.xpath('//div[@class="box"]').each do |node|
      title = node.children.css("h2").text
      # fb
      uri_fb    = URI.parse("http://graph.facebook.com/#{node.children.css("a").first[:href]}")
      json_fb   = Net::HTTP.get(uri_fb)
      result_fb = JSON.parse(json_fb)
      like  = result_fb["shares"]
    
      # twitter
      uri_twitter    = URI.parse("http://urls.api.twitter.com/1/urls/count.json?url=#{node.children.css("a").first[:href]}");
      json_twitter   = Net::HTTP.get(uri_twitter)
      result_twitter = JSON.parse(json_twitter)
      tweet = result_twitter["count"]

      # youtube
      youtube_src =  node.children.css("iframe").first[:src]
      if youtube_src.match(/youtube/)
        uri_youtube = URI.parse("http://gdata.youtube.com/feeds/api/videos/#{youtube_src.split("embed/")[1].split("?")[0]}")
        xml_youtube = Net::HTTP.get(uri_youtube)
        doc_youtube = Nokogiri::XML.parse(xml_youtube, nil, charset)
        video_sec = doc_youtube.xpath("//yt:duration").first[:seconds]
      end 

      p "#{title},#{like},#{tweet},#{video_sec}"
      f.write "#{title},#{like},#{tweet},#{video_sec}\n"
    end 
  end 
}

最終的なアウトプットは
title, like, tweet, video_sec
~, ~, ~, ~
~, ~, ~, ~
といったCSVになります。

ソースコードの流れを説明すると、
1. nokogiriというwebスクレイピングgemでタイトルを取得し変数に

doc.xpath('//div[@class="box"]').each do |node|
    title = node.children.css("h2").text
~ 
end

2. 同様に各記事詳細ページのURLを取得
2-1. いいね数, tweet数を取得する詳細ページのURLをパラメータとするAPIを叩く
2-2. API結果のJSONをパースし、いいね数とtweet数を取り出し変数に

doc.xpath('//div[@class="box"]').each do |node|
   # fb
      uri_fb    = URI.parse("http://graph.facebook.com/#{node.children.css("a").first[:href]}")
      json_fb   = Net::HTTP.get(uri_fb)
      result_fb = JSON.parse(json_fb)
      like  = result_fb["shares"]
    
      # twitter
      uri_twitter    = URI.parse("http://urls.api.twitter.com/1/urls/count.json?url=#{node.children.css("a").first[:href]}");
      json_twitter   = Net::HTTP.get(uri_twitter)
      result_twitter = JSON.parse(json_twitter)
      tweet = result_twitter["count"] 
~ 
end

3. 同様に各記事youtubeのURLを取得
3-1. そのURLからyoutube動画のIDを取得
3-2. 動画の情報を取得するIDをパラメータとするAPIを叩く
3-3. API結果のXMLをパースし、動画の秒数を取得

doc.xpath('//div[@class="box"]').each do |node|
~
   # youtube
      youtube_src =  node.children.css("iframe").first[:src]
      if youtube_src.match(/youtube/)
        uri_youtube = URI.parse("http://gdata.youtube.com/feeds/api/videos/#{youtube_src.split("embed/")[1].split("?")[0]}")
        xml_youtube = Net::HTTP.get(uri_youtube)
        doc_youtube = Nokogiri::XML.parse(xml_youtube, nil, charset)
        video_sec = doc_youtube.xpath("//yt:duration").first[:seconds]
      end 

      p "#{title},#{like},#{tweet},#{video_sec}"
      f.write "#{title},#{like},#{tweet},#{video_sec}\n"
~
end 

このような感じで上記のようなCSVが出力されます。

各記事のタイトル、いいね数、tweet数、動画の秒数がとれたので分析フェーズに行こうかと思います。

といったところで今回の記事はここまでです。
次回の分析編をお楽しみに!

(ちなみにどなたかこの結果を利用して分析したいという方がいればデータをお渡しします)