LoginSignup
18
15

More than 3 years have passed since last update.

 [にじさんじ統計学]Google Apps Scriptでライバーの情報を収集する

Last updated at Posted at 2020-03-01

概要

本記事は、バーチャルライバーグループ「にじさんじ」に関して統計解析を行うために、Youtube登録者数などの各ライバーの数値情報をGoogle Apps Script、YoutubeAPI、TwitterAPIを使って収集しました。

目次

  1. どうしてこの記事を書いたか
    1. Vtuber文化
    2. にじさんじ
  2. YoutubeAPIを使ったチャンネル登録者数、総閲覧数、アップロード動画数、サムネイル画像URLの収集 2. YouTube Data API v3を使えるようにする
    1. Googleスプレッドシート内で検索するチャンネルリストを作成 4. Google Apps Scriptでチャンネルタイトル、チャンネル登録者数、総閲覧数、アップロード動画数、サムネイル画像URLを自動取得
  3. TwitterAPIを使ったツイート数、フォロー数、フォロワー数、被リスト数、いいね数の収集
    1. TwitterAPIを使えるようにする
    2. TwitterAPIのためのライブラリをスプレッドシートに追加する
    3. Googleスプレッドシート内で検索するユーザーIDリストを作成
    4. Google Apps Scriptでツイート数、フォロー数、フォロワー数、被リスト数、いいね数を自動取得
  4. HTTP/HTTPSレスポンスからpixiv、ニコニコ、同人誌情報の収集
  5. 使用環境
  6. 参考資料
  7. 本記事の位置づけ
  8. 引用

どうしてこの記事を書いたか

Vtuber文化

VtuberバーチャルYoutuberの略称で、YouTube動画配信者のキズナアイが自分自身をそのように表現したのが最初といわれています(下動画)。

【自己紹介】はじめまして!キズナアイですლ(´ڡ`ლ)

Vtuberの定義はあいまいですが広く定義するならば「生身を出さずアバターのみで活動を行うストリーマー(ライバー)」となるかと思います。

キズナアイが活動をはじめた2016年12月から4年後、一時期のブームを経てVtuberは総計1万人を突破することになりました。

今やYouTubeにアクセスすればどこかのVtuberが必ず配信をやっていて、それぞれの配信に数千規模の視聴者がいることも珍しくありません。そして視聴者の一部はスーパーチャットという投げ銭機能を利用してライバーにお金を支払います。中には一人で数千万クラスの収益を達成しているライバーも存在しています。

Vtuberはファンの共有が非常に活発で、配信が終了すると別のライバーの配信に人が流れ込んで視聴者が数千人レベルで急増したり、ライバー同士でコラボするとそれぞれのファンが共有されたりします。

またVtuberのファン活動はYouTube以外の媒体でも広く行われていて、Titterやpixiv等でファンアートや同人誌が描かれたり、ニコニコ動画に切り抜き動画がアップロードされたりしています。そしてライバー側もそのファンアートを配信で使用したり、切り抜きに対してコメントを行なったりします。

このことからVtuberというコンテンツは、コンテンツ範囲がYouTubeにとどまらず様々なSNSにひろがっていて、そしてそれがライバーとファンのリアルタイムな相互作用によって形作られているといえるでしょう。

このような「誰もがコンテンツ側に回れるインターネット」を体現したような文化に対して、実際にはどういった因子同士が関連しているのかといった相互関係性を定量的に観察することには非常に興味をひかれます。

にじさんじ

本記事シリーズではこの観察を行う上で、にじさんじに注目しています。

にじさんじ株式会社いちからが運営する企業系Vtuberグループです。国内では最大手の一つで既に97名のライバー(2020年1月30日現在)を擁しています。一番有名なライバーだと月ノ美兎が挙げられるでしょうか。

よりぬき美兎ちゃん クソザコ編【5分ちょっと】

さて上の動画みてもわかりますが、にじさんじ配信の特徴として配信内容があまり一つの方向性に縛られていない点があります。
ライバーの嗜好によって配信する内容・スタイルは多種多様であり視聴者層もライバーによってかなり異なる印象です。
しかし企業系グループということもあってか頻繁ににじさんじ内のライバー同士でコラボ配信が行われます。

花畑チャイカと八重歯と妖精練習試合VS 特攻野郎Aチーム フルスクリーンでやるためにキャラ捨ててゲームをとるこれがバーチャルYouTuberなんだよなぁ...

このように配信ジャンルが多種多様でありながら数十人規模のライバー間で視聴者をシェアできるシステムをもっているのがにじさんじです。そのおかげもあってかデビューして一ヶ月経っていないライバーであっても数万規模のチャンネル登録者数を獲得することができています(もちろん彼等の配信そのものも面白いですが)。

しかしながら、閲覧数、登録者数、スーパーチャット収益といったものは同じにじさんじ内のライバーでもそこそこ異なっているのも事実です。

そこで、まず手始めとしてライバー間での違いにどのような要素が関わっていそうか調べるために、様々なサイトから各ライバーに関するデータの収集を行いました

収集した項目としては、ライバーのYoutubeチャンネル、Twitterの数値データ、およびpixiv、ニコニコ動画、同人誌数といったファン活動の指標、また非公式wikiにまとめられているデータ等も収集しました。もちろん全部手作業なんて不可能なので、GoogleスプレッドシートとGoogle Apps Scriptを利用して収集します。
各項目とその説明は次の表のとおりです。

項目 説明
ライバー名 公式の名前
Color ライバーのイメージカラー
Illustrator ライバーのイラストを作製したクリエイター
登録者数 ライバーのチャンネル登録者数
総閲覧数 ライバーの総閲覧数
スーパーチャット収益 VTuberポートレート】スパチャ収益トップ100(2019年)(ステッカーを含む)で言及されているライバーのスーパーチャット収益、言及のないライバーに関しては一律0円とした
アップロード動画数 ライバー自身の投稿動画数
pixivイラスト pixivイラスト検索ヒット数
pixiv小説 pixiv小説検索ヒット数
ニコニコ動画数 ニコニコ動画検索ヒット数
ニコニコマイリスト数 ニコニコマイリスト検索ヒット数
ニコニコ静画数 ニコニコ静画検索ヒット数
ニコニコ一般イラスト数 ニコニコ一般向けイラスト検索ヒット数
ニコニコ春画イラスト数 ニコニコ成人向けイラスト検索ヒット数
ニコニコイラスト数 ニコニコ総合イラスト検索ヒット数
ニコニコマンガ数 ニコニコ漫画検索ヒット数
twitterツイート数 ライバーのTwitterにおけるツイート数
twitterフォロー数 ライバーのTwitterにおけるフォロー数
twitterフォロワー数 ライバーのTwitterにおけるフォロワー数
twitter被リスト数 ライバーのTwitterがリストされている数
twitterいいね数 ライバーのTwitterでいいねした数
同人誌数 メロンブックスの同人誌検索ヒット数(一般向けを含む)
デビュー日 一期生(月ノ美兎等)のデビュー日(2018/01/31)を0日としたときの各ライバーデビュー日
身長 非公式wikiに記載されている各ライバーの身長設定
衣装数 非公式wikiに記載されている2D衣装の数
曲数 非公式wikiに記載されているライバーが動画としてだした曲数
配信ゲーム数 非公式wikiに記載されているライバーが配信したゲーム数
月ノ美兎 - イブラヒム ライバーとのコラボ度(コラボ度は4:オフライン(1対1) 3:オフライン 2:コラボ済み(1対1) 1:コラボ済み(複数人) 0:未コラボとしている)
全コラボ人数 これまでコラボした合計にじさんじライバー人数
1to1コラボ人数 コラボ度が4のライバー人数
オフコラボ人数 コラボ度が3以上のライバー人数
1to1オフコラボ人数 コラボ度が2以上のライバー人数
合計コラボ度 コラボ度の合計
平均コラボ度 コラボ度の平均
最高コラボ度 コラボ度の最大値
コラボ度標準偏差 コラボ度の標準偏差値
りんかえダブル - にじメンズプロデュース 各大規模コラボの参加
アナ - Unknown ライバーのイラストを作製したクリエイターかどうか
性別 非公式wikiに記載されている各ライバーの性別設定(男女どちらでもないものは声で判断)
ゲーム傾向 - 定期配信 非公式wikiに記載されている各ライバーの配信傾向
メジャーデビュー メジャーデビューの有無
身バレ記事 前世についてのゴシップ記事の存在
Minecraft(マイクラ) - トマトマトマトⅡ 〜トマトトトマトトトマトマトマトノトマト〜 非公式wikiに記載されているゲーム配信で扱ったことのあるタイトル

各項目の参照日時は次のとおりです。
YouTube:2020/02/23 8:21:00
Twitter:2020/02/23 8:11:00
pixiv:2020/02/23 8:35:00
ニコニコ:2020/02/26 3:17:00
メロンブックス:2020/02/23 8:45:00
コラボ一覧:2020-02-20 (木) 17:34:35

YoutubeAPIを使ったチャンネル登録者数、総閲覧数、アップロード動画数、サムネイル画像URLの収集

YouTube Data API v3を使えるようにする

  • Google Apps ScriptやGoogle Cloud Platformを利用するために、以下のリンクからGoogleアカウントを取得します。

  • Google APIsへアクセスします。

  • 「認証情報を作成」-「APIキー」を選択

  • APIキーが出力されるのでこれをメモします。

  • 「ライブラリ」を選択し、検索フォームに「YouTube Data API v3」と入力して、合致する検索結果をクリックします。

  • 「YouTube Data API v3」のページで「有効にする」をクリック

Googleスプレッドシート内で検索するチャンネルリストを作成

  • Googleスプレッドシートにアクセスして「Googleスプレッドシートを使ってみる」をクリック

  • 「空白」をクリックすることで、スプレッドシートを新規作成

  • にじさんじ非公式wikiからチャンネルURLを一覧を取得

    • にじさんじ非公式wikiランディングページからHTMLソースを取得
    • Visual Studio Codeの正規表現でライバー名とYouTubeチャンネルリンクを抽出

      • 検索:href="(https://www.youtube.com/channel/.*?)/live.*?alt="(.*?) / YouTube"
      • 置換:\n¥$1\t$2\n
      • 検索:^[^¥].*
      • 置換:(空白)
      • 検索:^\n
      • 置換:(空白)
      • 検索:
      • 置換:(空白)
      • 文野環だけうまく抽出できないので「https://www.youtube.com/channel/UCt0clH12Xk1-Ej5PXKGfdPA 文野環」を物述有栖の後ろに追加
    • Googleスプレッドシートへコピペ

    • コピペした範囲を再度コピーして、特殊貼り付け -> 転置して貼り付け

    • B1, B2に月ノ美兎の名前, チャンネルURLがくるように入れ替えて配置

Screen Shot 2020-03-01 at 5.17.09 AM.png

Google Apps Scriptでチャンネルタイトル、チャンネル登録者数、総閲覧数、アップロード動画数、サムネイル画像URLを自動取得

  • リストを作成したGoogleスプレッドシート上で「ツール」 -> 「スクリプト エディタ」をクリック

  • 次のスクリプトを実行(APIキーとシート名は各自入力)

function getChannelData() {

 //APIキー
 var key = "<取得したAPIキー>";
 var sheetName = "<リストのあるシート名>" 

 var ss = SpreadsheetApp.getActiveSpreadsheet()
 var srcSheet = ss.getSheetByName(sheetName);

 var row_title = 1;
 var row_url = 2;
 var row_subscribe = 3;
 var row_view = 4;
 var row_video = 5;
 var row_thumbnails_url = 6;
 var colStart = 2;
 var colEnd = srcSheet.getDataRange().getLastColumn();

 // 各列ごとに処理
 for (i=colStart; i<=colEnd; i++) {

   // チャンネルをセット
   var channelURL = srcSheet.getRange(row_url,i).getValue();
   var channelID = channelURL.slice(32);

   // 各種データのURL生成
   var channels_snippet_url = "https://www.googleapis.com/youtube/v3/channels?part=snippet&id=" + channelID +"&key=" + key ;
   var channels_statistics_url = "https://www.googleapis.com/youtube/v3/channels?part=statistics&id=" + channelID +"&key=" + key;

   // 各種データ取得
   var channels_snippet_response = UrlFetchApp.fetch(channels_snippet_url)
   var channels_statistics_response = UrlFetchApp.fetch(channels_statistics_url)

   //チャンネルタイトルを抽出
   var channnelTitle = JSON.parse(channels_snippet_response.getContentText()).items[0].snippet.title;

   //登録者数を取得
   var subscribe_cnt = JSON.parse(channels_statistics_response.getContentText()).items[0].statistics.subscriberCount;

   //総閲覧数を取得
   var view_cnt = JSON.parse(channels_statistics_response.getContentText()).items[0].statistics.viewCount;

   //アップロード動画数を取得
   var video_cnt = JSON.parse(channels_statistics_response.getContentText()).items[0].statistics.videoCount;

   //サムネイル画像URLを取得
   var thumbnails_url = JSON.parse(channels_snippet_response.getContentText()).items[0].snippet.thumbnails.default.url; //古いランタイムではエラーがでる

   //チャンネルタイトルをシートに挿入
   srcSheet.getRange(row_title,i).setValue(channnelTitle); 

   //登録者数をシートに挿入
   srcSheet.getRange(row_subscribe,1).setValue("登録者数");
   srcSheet.getRange(row_subscribe,i).setValue(subscribe_cnt);

   //総再生回数をシートに挿入
   srcSheet.getRange(row_view,1).setValue("総閲覧数");
   srcSheet.getRange(row_view,i).setValue(view_cnt);

   //動画数をシートに挿入
   srcSheet.getRange(row_video,1).setValue("アップロード動画数");
   srcSheet.getRange(row_video,i).setValue(video_cnt);

   //サムネイル画像URLをシートに挿入
   srcSheet.getRange(row_thumbnails_url,1).setValue("サムネイル画像URL");
   srcSheet.getRange(row_thumbnails_url,i).setValue(thumbnails_url);

 }

};

  • 「このアプリは確認されていません」という警告がでるが、「詳細」 -> 「***(安全ではないページ)に移動
    」をクリックして、許可を押す。

  • うまくいけばスプレッドシートが以下のように書き換えられる。エラーがでた場合は「APIキー」もしくは「シート名」が間違っている可能性が高い。

Screen Shot 2020-03-01 at 6.07.05 AM.png

TwitterAPIを使ったツイート数、フォロー数、フォロワー数、被リスト数、いいね数の収集

TwitterAPIを使えるようにする

  • Twitter Developer Platformにアクセスして、Sign In

  • 「Apply」 -> 「Apply for a developer account」をクリック

  • 「Exploring the API」を選択して、「Next」をクリック

  • 居住国とニックネームを記入
    Screen Shot 2020-03-01 at 6.42.27 AM.png

  • 「APIの使用用途」「ツイートやユーザの解析仕方」「主に利用するツイッターの機能」「集取データを外部サイトへ公開する予定」「公的な団体での利用」等について英語で回答する。該当しないものはNoにしておく。

英文はそれほど専門的かつ細かく書く必要はないと思われる。たとえば私の場合は"I am planning to get infromation of YouTube streamers I like, including the number of tweet, follows and followers, using the API. The target number is..." くらいの内容をダラダラ書いても問題なかった。

  • 全て終わると確認メールが送信されるので確認する。

  • しばらくすると以下のようなメールがくるので返信する。今回は文字制限がないので短め適当に返す。
    Screen Shot 2020-03-01 at 7.13.04 AM.png

返信メール

Hi,

I answered your four questions. Could you check it?

The core use case, intent, or business purpose for your use of the Twitter APIs.

> For hobby, I get information of specific users who is streamer I like, and then I would like to perform data mining.

If you intend to analyze Tweets, Twitter users, or their content, share details about the analyses you plan to conduct, and the methods or techniques.

> I am planning to mainly get the number of followers/follows/tweet using Google Apps Script. I will extract the values form the JSON data your API will provide. The analysis targets are 96 kinds accounts.

If your use involves Tweeting, Retweeting, or liking content, share how you’ll interact with Twitter accounts, or their content.
> I have no plan to do that. I use it for looking data.

If you’ll display Twitter content off of Twitter, explain how, and where, Tweets and Twitter content will be displayed with your product or service, including whether Tweets and Twitter content will be displayed at row level, or aggregated
> I display the aggregated data in qiita (https://qiita.com). This is a Japanese SNS for developers.

  • 書いてから半日くらい経つと承認メールが届く

Screen Shot 2020-03-01 at 7.12.48 AM.png

  • developer accountにアクセスして、「アカウント名」 -> 「Get started」 -> 「Create an app」 に移動して、「Create an app」をクリックする。

  • (required)となっている項目について記入して「Create」を押す。今回はスプレッドシート上で利用するだけなので、固有のURLをもつ公開アプリというのとは異なる。そのためウェブサイトURLは自分のqiitaアカウントにしておいた。

  • Createした後は、上部に「Keys and tokens」タブが表示されるのでそれをクリックしてAPIキーとAPIシークレットキーをメモしておく。

TwitterAPIのためのライブラリをスプレッドシートに追加する

  • 「リソース」 -> 「ライブラリ」をクリック

  • Monsieur Igashiが公開しているライブラリTwitterWebService.gsをロードするために、「プロジェクトキー:1rgo8rXsxi1DxI_5Xgo_t3irTw1Y5cxl2mGSkbozKsSXf2E_KBBPC3xTF」を入力して追加、保存。

  • スプレッドシートの「ファイル」 -> 「プロジェクトのプロパティ」をクリック

  • スクリプトIDをメモ

  • Twitter Developerサイトに戻って、作製したアプリのページの「Detailed」 -> 「Edit」→「Edit details」をクリック

  • Callback URLsの欄に"https://script.google.com/macros/d/<スクリプトID>/usercallback
    "を書き加えて保存。

  • Chrome V8を搭載したランタイムを一旦無効化して、もりさんのプログラミング手帳様のスクリプトをGoogle Apps Scriptで実行

Screen Shot 2020-03-01 at 8.08.51 AM.png

実行するもりさんのプログラミング手帳様のスクリプト部分

//認証用インスタンスの生成
var twitter = TwitterWebService.getInstance(

...(省略)

  twitter.authorize();
}
  • 「表示」 -> [ログ]をクリック

  • ログ内容にあるURLへ飛ぶとTwitterの認証確認画面が表示されるので認証する。

Googleスプレッドシート内で検索するユーザーIDリストを作成

  • にじさんじ非公式wikiからユーザーIDを一覧を取得

    • にじさんじ非公式wikiランディングページからHTMLソースを取得
    • Visual Studio Codeの正規表現でライバー名とユーザーIDを抽出

      • 検索:<a class="ext" href="https://twitter.com/(.*?)" rel="nofollow"><img src=".*? alt="(.*?) / Twitter
      • 置換:\n¥$2\t$1\n
      • 検索:^[^¥].*
      • 置換:(空白)
      • 検索:^\n
      • 置換:(空白)
      • 検索:
      • 置換:(空白)
    • Googleスプレッドシートへコピペ

    • コピペした範囲を再度コピーして、特殊貼り付け -> 転置して貼り付け

    • B1, B2に月ノ美兎の名前, ユーザーIDがくるように入れ替えて配置

Google Apps Scriptでツイート数、フォロー数、フォロワー数、被リスト数、いいね数を自動取得

  • 次のスクリプトを実行(シート名は各自入力)
function getTwitterData() {

  var sheetName = "<リストのあるシート名>" 

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var srcSheet = ss.getSheetByName(sheetName);

  var row_name = 2;
  var row_tweets = 3;
  var row_follows = 4;
  var row_followers = 5;
  var row_lists = 6;
  var row_likes = 7;
  var colStart = 2;
  var colEnd = srcSheet.getDataRange().getLastColumn();

  for (i=colStart; i<=colEnd; i++) {

   // ライバー名をセット
   var twitter_id = srcSheet.getRange(row_name,i).getValue();

   // リクエスト
   var twitter_service  = twitter.getService();
   var twitter_response = twitter_service.fetch('https://api.twitter.com/1.1/users/show.json?screen_name=' + twitter_id);
   // JSON形式へ変換
   var twitter_json = JSON.parse(twitter_response);

   // ツイート数をシートに挿入
   srcSheet.getRange(row_tweets,1).setValue("twitterツイート数");
   srcSheet.getRange(row_tweets,i).setValue(twitter_json['statuses_count']);

   // フォロー数をシートに挿入
   srcSheet.getRange(row_follows,1).setValue("twitterフォロー数");
   srcSheet.getRange(row_follows,i).setValue(twitter_json['friends_count']);

   // フォロワー数をシートに挿入
   srcSheet.getRange(row_followers,1).setValue("twitterフォロワー数");
   srcSheet.getRange(row_followers,i).setValue(twitter_json['followers_count']);

   // 被リスト数をシートに挿入
   srcSheet.getRange(row_lists,1).setValue("twitter被リスト数");
   srcSheet.getRange(row_lists,i).setValue(twitter_json['listed_count']);

   // いいね数をシートに挿入
   srcSheet.getRange(row_likes,1).setValue("twitterいいね数");
   srcSheet.getRange(row_likes,i).setValue(twitter_json['favourites_count']);

  }
};

HTTP/HTTPSレスポンスからpixiv、ニコニコ、同人誌情報の収集

  • 前述のYoutube解析のときに作成したライバーの名前リストをGoogleスプレッドシードにコピペ(他作品との名前被りに注意)

  • 以下のスクリプトでpixivイラスト数、pixiv小説数を収集します。途中で停止してしまう場合は、スリープの時間(Utilities.sleep(500))を調整するとよい。

function getPixivData() {

  var sheetName = "<リストのあるシート名>" 

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var srcSheet = ss.getSheetByName(sheetName);

  var row_name = 2;
  var row_illust = 3;
  var row_novel = 4;
  var colStart = 2;
  var colEnd = srcSheet.getDataRange().getLastColumn();

  for (i=colStart; i<=colEnd; i++) {

   // ライバー名をセット
   var streamer_name = srcSheet.getRange(row_name,i).getValue();

   // アクセス先
   var pixiv_url = "https://www.pixiv.net/tags/" + streamer_name;
   // GETリクエスト
   var pixiv_response = UrlFetchApp.fetch(pixiv_url);
   // HTMLの結果を取得
   var illust_content = pixiv_response.getContentText("UTF-8");
   var novels_content = pixiv_response.getContentText("UTF-8");

   // 正規表現
   var illust_reg = /([0-9]*)件のイラスト/;
   var novel_reg = /([0-9]*)件の小説/;

   // イラスト数をシートに挿入
   srcSheet.getRange(row_illust,1).setValue("pixivイラスト");
   srcSheet.getRange(row_illust,i).setValue(illust_content.match(illust_reg)[1]);

   // 小説数をシートに挿入
   srcSheet.getRange(row_novel,1).setValue("pixiv小説");
   if(novels_content.match(novel_reg) !== null){
     srcSheet.getRange(row_novel,i).setValue(novels_content.match(novel_reg)[1]);
   }else{
     srcSheet.getRange(row_novel,i).setValue(0);
   }

   Utilities.sleep(500) // ここを調整
  }
};

  • 以下のスクリプトでニコニコマイリスト数、ニコニコ静画数、ニコニコ一般イラスト数、ニコニコ春画イラスト数、ニコニコイラスト数、ニコニコマンガ数を収集します。
function getNiconicoData() {

  var sheetName = "<リストのあるシート名>" 

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var srcSheet = ss.getSheetByName(sheetName);

  var row_name = 2;
  var row_movie = 3;
  var row_mylist = 4;
  var row_seiga = 5;
  var row_ippan = 6;
  var row_shunga = 7;
  var row_illust = 8;
  var row_manga = 9;
  var colStart = 2;
  var colEnd = srcSheet.getDataRange().getLastColumn();

  for (i=colStart; i<=colEnd; i++) {

   // ライバー名をセット
   var streamer_name = srcSheet.getRange(row_name,i).getValue();

   // アクセス先
   var niconico_url = "https://seiga.nicovideo.jp/search/" + streamer_name + "?target=illust&track=seiga_illust_keyword";
   // GETリクエスト
   var niconico_response = UrlFetchApp.fetch(niconico_url);
   // HTMLの結果を取得
   var movie_content = niconico_response.getContentText("UTF-8");
   var mylist_content = niconico_response.getContentText("UTF-8");
   var seiga_content = niconico_response.getContentText("UTF-8");
   var live_content = niconico_response.getContentText("UTF-8");
   var ippan_content = niconico_response.getContentText("UTF-8");
   var shunga_content = niconico_response.getContentText("UTF-8");
   var illust_content = niconico_response.getContentText("UTF-8");
   var manga_content = niconico_response.getContentText("UTF-8");

   // 正規表現
   var movie_reg = /\<div\>動画\( \<strong class=".+?">([0-9,]*)/;
   var mylist_reg = /\<div\>マイリスト\( \<strong class=".+?">([0-9,]*)/;
   var seiga_reg = /\<div\>静画\( \<strong class=".+?">([0-9,]*)/;
   var ippan_reg = /一般\<\/a>\n\<span class="count"\>\(([0-9]*)/;
   var shunga_reg = /春画\(R-15\)\<\/a>\n\<span class="count"\>\(([0-9]*)/;
   var illust_reg = /イラスト\(([0-9]*)/;
   var manga_reg = /マンガ\(([0-9]*)/;

   // 動画数をシートに挿入
   srcSheet.getRange(row_movie,1).setValue("ニコニコ動画数");
   srcSheet.getRange(row_movie,i).setValue(movie_content.match(movie_reg)[1]);

   // マイリスト数をシートに挿入
   srcSheet.getRange(row_mylist,1).setValue("ニコニコマイリスト数");
   srcSheet.getRange(row_mylist,i).setValue(mylist_content.match(mylist_reg)[1]);

   // 静画数をシートに挿入
   srcSheet.getRange(row_seiga,1).setValue("ニコニコ静画数");
   srcSheet.getRange(row_seiga,i).setValue(seiga_content.match(seiga_reg)[1]);

   // 一般イラスト数をシートに挿入
   srcSheet.getRange(row_ippan,1).setValue("ニコニコ一般イラスト数");
   srcSheet.getRange(row_ippan,i).setValue(ippan_content.match(ippan_reg)[1]);

   // 春画イラスト数をシートに挿入
   srcSheet.getRange(row_shunga,1).setValue("ニコニコ春画イラスト数");
   srcSheet.getRange(row_shunga,i).setValue(shunga_content.match(shunga_reg)[1]);

   // イラスト数をシートに挿入
   srcSheet.getRange(row_illust,1).setValue("ニコニコイラスト数");
   srcSheet.getRange(row_illust,i).setValue(illust_content.match(illust_reg)[1]);

   // マンガ数をシートに挿入
   srcSheet.getRange(row_manga,1).setValue("ニコニコマンガ数");
   srcSheet.getRange(row_manga,i).setValue(manga_content.match(manga_reg)[1]);

  }
};
  • 以下のスクリプトでメロンブックスで販売されている同人誌数を収集します。
function getDoujinData() {

  var sheetName = "<リストのあるシート名>" 

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var srcSheet = ss.getSheetByName(sheetName);

  var row_name = 2;
  var row_doujin = 3;
  var colStart = 2;
  var colEnd = srcSheet.getDataRange().getLastColumn();

  for (i=colStart; i<=colEnd; i++) {

   // ライバー名をセット
   var streamer_name = srcSheet.getRange(row_name,i).getValue();

   // アクセス先
   var doujin_url = "https://www.melonbooks.co.jp/tags/index.php?chara=" + streamer_name;
   // GETリクエスト
   var doujin_response = UrlFetchApp.fetch(doujin_url);
   // HTMLの結果を取得
   var doujin_content = doujin_response.getContentText("UTF-8");
   if(doujin_content.match(/([0-9]*?)件あります。/) !== null){
     var doujin_num = doujin_content.match(/([0-9]*?)件あります。/)[1];
   }else{
     var doujin_num = 0;
   }

   // イラスト数をシートに挿入
   srcSheet.getRange(row_doujin,1).setValue("同人誌数");
   srcSheet.getRange(row_doujin,i).setValue(doujin_num);

  }
};

  • 取得したデータを一つのシートにまとめる

  • チャンネルが二つある場合は、登録者数は多い方、閲覧数・アップロード数は合計として列を統合

最終的に以下のような図が出来上がります。

Screen Shot 2020-03-02 at 2.08.19 AM.png

それでは次の記事ではこのデータセットを使って様々な解析を行ってみたいと思います。

使用環境

MacBookAir
1.4 GHz Dual-Core Intel Core i5
4GB メモリ

Safari
version 13.0.5

Visual Studio Code
version 1.42.1

参考資料

Vtuber

「今さら聞けない『VTuber』とは! 文化的・法的観点から考える」
初期Vtuberブームと現在のブームについて
VTuberが1万人を突破 生き残りかけ個性派がひしめくVTuber界のリアル

YouTube Data API

YouTube Data API の概要
YouTube > Date API | 承認の認証情報を取得する
Youtubeチャンネル登録者数を自動監視するスプレッドシートの作り方

Twitter API

TwitterDeveloperアカウントの申請とAPIキー取得(GAS×TwitterBot①)
Google Apps ScriptでTwitterに投稿するスクリプト(GAS×TwitterBot④)
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2019年8月時点の情報
【GAS×Twitter API】フォロワー数を自動で記録

Google Apps Script

Class UrlFetchApp

本記事の位置づけ

本記事は個人の自己学習の一環として、株式会社いちからが運営するバーチャルライバーグループ「にじさんじ」についての数値データを扱っています。
記事内では当該グループおよびそのメンバーの誹謗中傷を助長するような文脈とならないよう細心の注意を払っていますが、Qiitaもしくは株式会社いちからからご指摘があった際には速やかな変更あるいは削除をさせていただきますのでご了承ください。
また本記事のWeb魚拓は著者として許可できません。

著者は本記事を「にじさんじ」の二次創作物と位置付けており、以下の規則に従うものとします。
にじさんじ二次創作ガイドライン

画像・データの引用元一覧は記事の最後に記載しています。

引用

非公式wiki

ランディングページ
公式キャラクター
メンバーデータ一覧
歌唱まとめ
コラボ一覧表
コラボ総当たり表

  • 参照したのは2020-02-20 (木) 17:34:35時点までの情報

その他

VTuberポートレート】スパチャ収益トップ100(2019年)(ステッカーを含む)
ゲームまとめ

各ライバーのYoutubeチャンネル

Youtube | 月ノ美兎
Youtube | 月ノ美兎
Youtube | 勇気ちひろ
Youtube | 勇気ちひろ
Youtube | エルフのえる / にじさんじ所属
Youtube | エルフのえる / にじさんじ所属
Youtube | 樋口楓【にじさんじ所属】
Youtube | 樋口楓【にじさんじ所属】
Youtube | Shizuka Rin Official
Youtube | Shizuka Rin Official
Youtube | 渋谷ハジメのはじめ支部
Youtube | 渋谷ハジメのはじめ支部
Youtube | アキくんちゃんネル
Youtube | アキくんちゃんネル
Youtube | 鈴谷アキの陽だまりの庭
Youtube | 鈴谷アキの陽だまりの庭
Youtube | 《にじさんじ所属の女神》モイラ
Youtube | 《にじさんじ所属の女神》モイラ
Youtube | 鈴鹿詩子 Utako Suzuka
Youtube | 鈴鹿詩子 Utako Suzuka
Youtube | 宇志海いちご
Youtube | 宇志海いちご
Youtube | 家長むぎ【にじさんじ所属】
Youtube | 家長むぎ【にじさんじ所属】
Youtube | Yuhi Riri Official
Youtube | Yuhi Riri Official
Youtube | ♥️♠️物述有栖♦️♣️
Youtube | ♥️♠️物述有栖♦️♣️
Youtube | 文野環【にじさんじの野良猫】ふみのたまき
Youtube | 文野環【にじさんじの野良猫】ふみのたまき
Youtube | 伏見ガク【にじさんじ所属】
Youtube | 伏見ガク【にじさんじ所属】
Youtube | Gilzaren III Season 2
Youtube | Gilzaren III Season 2
Youtube | 剣持刀也
Youtube | 剣持刀也
Youtube | 森中花咲
Youtube | 森中花咲
Youtube | Kanae Channel
Youtube | Kanae Channel
Youtube | Akabane Channel
Youtube | Akabane Channel
Youtube | 笹木咲 / Sasaki Saku
Youtube | 笹木咲 / Sasaki Saku
Youtube | 本間ひまわり - Himawari Honma -
Youtube | 本間ひまわり - Himawari Honma -
Youtube | 魔界ノりりむ
Youtube | 魔界ノりりむ
Youtube | Kuzuha Channel
Youtube | Kuzuha Channel
Youtube | 椎名唯華
Youtube | 椎名唯華
Youtube | ドーラ
Youtube | ドーラ
Youtube | 《IzumoKasumi》Project channel【にじさんじ】
Youtube | 《IzumoKasumi》Project channel【にじさんじ】
Youtube | 轟京子/kyoko todoroki【にじさんじ】
Youtube | 轟京子/kyoko todoroki【にじさんじ】
Youtube | シスター・クレア -SisterClaire-
Youtube | シスター・クレア -SisterClaire-
Youtube | 花畑チャイカ
Youtube | 花畑チャイカ
Youtube | 社築
Youtube | 社築
Youtube | 安土桃
Youtube | 安土桃
Youtube | D.E.放送局【鈴木勝/にじさんじ】
Youtube | D.E.放送局【鈴木勝/にじさんじ】
Youtube | Re‡D.E.放送局【鈴木勝/にじさんじ】
Youtube | Re‡D.E.放送局【鈴木勝/にじさんじ】
Youtube | 緑仙channel
Youtube | 緑仙channel
Youtube | みどりのさぶちゃんねる
Youtube | みどりのさぶちゃんねる
Youtube | 卯月コウ
Youtube | 卯月コウ
Youtube | 【にじさんじ】神田笑一
Youtube | 【にじさんじ】神田笑一
Youtube | 飛鳥ひな【にじさんじ所属】
Youtube | 飛鳥ひな【にじさんじ所属】
Youtube | 春崎エアル
Youtube | 春崎エアル
Youtube | 雨森小夜
Youtube | 雨森小夜
Youtube | 鷹宮リオン
Youtube | 鷹宮リオン
Youtube | 舞元啓介
Youtube | 舞元啓介
Youtube | 竜胆 尊 / Rindou Mikoto
Youtube | 竜胆 尊 / Rindou Mikoto
Youtube | でび縺」縺。縺ッ豁サ縺ォ縺セ縺励
Youtube | でび縺」縺。縺ッ豁サ縺ォ縺セ縺励
Youtube | でびでび・でびる
Youtube | でびでび・でびる
Youtube | 桜凛月
Youtube | 桜凛月
Youtube | 町田ちま【にじさんじ】
Youtube | 町田ちま【にじさんじ】
Youtube | ジョー・力一 Joe Rikiichi
Youtube | ジョー・力一 Joe Rikiichi
Youtube | 遠北千南 / Achikita Chinami 【にじさんじ】
Youtube | 遠北千南 / Achikita Chinami 【にじさんじ】
Youtube | 成瀬 鳴
Youtube | 成瀬 鳴
Youtube | ベルモンド・バンデラス
Youtube | ベルモンド・バンデラス
Youtube | 矢車りね - Rine Yaguruma -
Youtube | 矢車りね - Rine Yaguruma -
Youtube | 夢追翔のJUKE BOX
Youtube | 夢追翔のJUKE BOX
Youtube | 黒井しば【にじさんじの犬】
Youtube | 黒井しば【にじさんじの犬】
Youtube | 童田明治-わらべだめいじー-
Youtube | 童田明治-わらべだめいじー-
Youtube | 【3年0組】郡道美玲の教室
Youtube | 【3年0組】郡道美玲の教室
Youtube | 夢月ロア🌖Yuzuki Roa
Youtube | 夢月ロア🌖Yuzuki Roa
Youtube | 小野町春香♨Onomachi Haruka にじさんじ
Youtube | 小野町春香♨Onomachi Haruka にじさんじ
Youtube | 語部紡
Youtube | 語部紡
Youtube | 瀬戸 美夜子 - Miyako Seto
Youtube | 瀬戸 美夜子 - Miyako Seto
Youtube | 御伽原 江良 / Otogibara Era【にじさんじ】
Youtube | 御伽原 江良 / Otogibara Era【にじさんじ】
Youtube | 戌亥とこ -Inui Toko-
Youtube | 戌亥とこ -Inui Toko-
Youtube | アンジュ・カトリーナ - Ange Katrina -
Youtube | アンジュ・カトリーナ - Ange Katrina -
Youtube | リゼ・ヘルエスタ -Lize Helesta-
Youtube | リゼ・ヘルエスタ -Lize Helesta-
Youtube | 三枝明那 / Akina Saegusa
Youtube | 三枝明那 / Akina Saegusa
Youtube | 愛園 愛美/Aizono Manami
Youtube | 愛園 愛美/Aizono Manami
Youtube | 鈴原るる【にじさんじ所属】
Youtube | 鈴原るる【にじさんじ所属】
Youtube | 雪城眞尋/Yukishiro Mahiro【にじさんじ所属】
Youtube | 雪城眞尋/Yukishiro Mahiro【にじさんじ所属】
Youtube | エクス・アルビオ -Ex Albio-
Youtube | エクス・アルビオ -Ex Albio-
Youtube | レヴィ・エリファ-Levi Elipha-
Youtube | レヴィ・エリファ-Levi Elipha-
Youtube | 葉山舞鈴 / Hayama Marin【にじさんじ所属】
Youtube | 葉山舞鈴 / Hayama Marin【にじさんじ所属】
Youtube | ニュイ・ソシエール //![Nui Sociere]
Youtube | ニュイ・ソシエール //[Nui Sociere]
Youtube | 葉加瀬 冬雪 / Hakase Fuyuki
Youtube | 葉加瀬 冬雪 / Hakase Fuyuki
Youtube | 加賀美 ハヤト/Hayato Kagami
Youtube | 加賀美 ハヤト/Hayato Kagami
Youtube | 夜見れな/yorumi rena【にじさんじ所属】
Youtube | 夜見れな/yorumi rena【にじさんじ所属】
Youtube | 黛 灰 / Kai Mayuzumi【にじさんじ】
Youtube | 黛 灰 / Kai Mayuzumi【にじさんじ】
Youtube | アルス・アルマル -ars almal- 【にじさんじ】
Youtube | アルス・アルマル -ars almal- 【にじさんじ】
Youtube | 相羽ういは〖Aiba Uiha〗にじさんじ所属
Youtube | 相羽ういは〖Aiba Uiha〗にじさんじ所属
Youtube | 天宮 こころ / Kokoro Amamiya 【にじさんじ所属】
Youtube | 天宮 こころ / Kokoro Amamiya 【にじさんじ所属】
Youtube | エリー・コニファー / Eli Conifer【にじさんじ】
Youtube | エリー・コニファー / Eli Conifer【にじさんじ】
Youtube | ラトナ・プティ -Ratna Petit -にじさんじ所属
Youtube | ラトナ・プティ -Ratna Petit -にじさんじ所属
Youtube | 早瀬 走 / Hayase Sou【にじさんじ所属】
Youtube | 早瀬 走 / Hayase Sou【にじさんじ所属】
Youtube | 健屋花那【にじさんじ】KanaSukoya
Youtube | 健屋花那【にじさんじ】KanaSukoya
Youtube | シェリン・バーガンディ -Shellin Burgundy- 【にじさんじ】
Youtube | シェリン・バーガンディ -Shellin Burgundy- 【にじさんじ】
Youtube | フミ/にじさんじ
Youtube | フミ/にじさんじ
Youtube | 星川サラ / Sara Hoshikawa
Youtube | 星川サラ / Sara Hoshikawa
Youtube | 山神 カルタ / Karuta Yamagami
Youtube | 山神 カルタ / Karuta Yamagami
Youtube | えま★おうがすと
Youtube | えま★おうがすと
Youtube | ルイス・キャミー
Youtube | ルイス・キャミー
Youtube | 魔使マオ -matsukai mao-
Youtube | 魔使マオ -matsukai mao-
Youtube | 不破 湊 / Fuwa Minato【にじさんじ】
Youtube | 不破 湊 / Fuwa Minato【にじさんじ】
Youtube | 白雪 巴/Shirayuki Tomoe【にじさんじ】
Youtube | 白雪 巴/Shirayuki Tomoe【にじさんじ】
Youtube | グウェル・オス・ガール / Gwelu Os Gar 【にじさんじ】
Youtube | グウェル・オス・ガール / Gwelu Os Gar 【にじさんじ】
Youtube | ましろ / Mashiro
Youtube | ましろ / Mashiro
Youtube | 奈羅花 - Naraka -
Youtube | 奈羅花 - Naraka -
Youtube | 来栖 夏芽-kurusu natsume-【にじさんじ】
Youtube | 来栖 夏芽-kurusu natsume-【にじさんじ】
Youtube | フレン・E・ルスタリオ
Youtube | フレン・E・ルスタリオ
Youtube | メリッサ・キンレンカ
Youtube | メリッサ・キンレンカ
Youtube | イブラヒム【にじさんじ】
Youtube | イブラヒム【にじさんじ】

各ライバーのTwitterアカウント

月ノ美兎
勇気ちひろ
える
樋口楓
静凛
渋谷ハジメ
鈴谷アキ
鈴谷アキ
モイラ
鈴鹿詩子
宇志海いちご
家長むぎ
夕陽リリ
物述有栖
文野環
伏見ガク
ギルザレンIII世
剣持刀也
森中花咲

赤羽葉子
笹木咲
本間ひまわり
魔界ノりりむ
葛葉
椎名唯華
ドーラ
出雲霞
轟京子
シスター・クレア
花畑チャイカ
社築
安土桃
鈴木勝
鈴木勝
緑仙
緑仙
卯月コウ
神田笑一
鳴門こがね
春崎エアル
雨森小夜
鷹宮リオン
舞元啓介
竜胆尊
でびでび・でびる
でびでび・でびる
桜凛月
町田ちま
ジョー・力一
遠北千南
成瀬鳴
ベルモンド・バンデラス
矢車りね
夢追翔
黒井しば
童田明治
郡道美玲
夢月ロア
小野町春香
語部紡
瀬戸美夜子
御伽原江良
戌亥とこ
アンジュ・カトリーナ
リゼ・ヘルエスタ
三枝明那
愛園愛美
鈴原るる
雪城眞尋
エクス・アルビオ
レヴィ・エリファ
葉山舞鈴
ニュイ・ソシエール
葉加瀬冬雪
加賀美ハヤト
夜見れな
黛灰
アルス・アルマル
相羽ういは
天宮こころ
エリー・コニファー
ラトナ・プティ
早瀬走
健屋花那
シェリン・バーガンディ
フミ
星川サラ
山神カルタ
えま★おうがすと
ルイス・キャミー
魔使マオ
不破湊
白雪巴
グウェル・オス・ガール
ましろ
奈羅花
来栖夏芽
フレン・E・ルスタリオ
メリッサ・キンレンカ
イブラヒム

18
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
15