Youtubeのコメントをスクレイピングする


概要

コメントの親子関係を利用したビデオ共有サイトにおけるネットいじめコメントの検出では,Youtubeに投稿されたコメントを対象に,いじめコメントの検出を行っている.この研究のために,YoutubeコメントのスクレイピングツールYoutube comment scraperを作成した.

Youtube comment scraper

そのなの通り,Youtubeの動画再生ページをスクレイピングして,投稿されたコメントを取得する.パッケージはnpmに登録してあるので,npmコマンドにてインストールできる.

スタンドアロンで利用する場合,

$ npm install -g youtube-comment-scraper

とすれば,scraperコマンドが利用できるようになる.このコマンドの利用方法は,

Usage: scraper url [options]

   url
        URL for a Youtube video page or video ID.

   --help, -h
        Displays help information about this script

   --version
        Displays version info

となっていて,要するにYoutubeの動画再生ページのURLか,動画IDを渡せば良い.
例えば,

# URLを渡す場合.
$ scraper "https://www.youtube.com/watch?v=vN4U5FqrOdQ"

# IDを渡す場合
$ scraper vN4U5FqrOdQ

などとなる.出力はJSON形式で下記のようなフォーマットである.

{
  "id": "動画 ID",
  "channel":{
    "id": "チャンネルの ID",
    "name" : "チャンネル名"
  },

  "comments": [
    {
      "root": "親コメント",
      "author": "このコメントの投稿者",
      "author_id": "投稿者のID",
      "like": "いいねスコア(下記参照)",
      "children": [
        {
          "comment": "親コメントへのリプライ",
          "author": "リプライの投稿者",
          "author_id": "投稿者のID",
          "like": "いいねスコア",
        },
        ...
      ]
    },
    ...
  ]
}

いいねスコアは,各コメントに与えられたの個数からの個数を引いたスコアである.

また,各動画は複数の親コメントを持ち,各親コメントは複数のリプライを持ち得る.

モジュールとしての利用

var scraper = require("youtube-comment-scraper");

として他のプログラムから呼び出して使うこともできる.(その場合はローカルにインストールする)このモジュールが提供する関数は次の2つである.

scraper.comments(url)

与えられた動画再生ページのURLまたは動画IDを元に,スクレイピングを行う.

  • 引数:
    • url: 動画再生ページのURLまたは動画ID.
  • 戻り値: 非同期でスクレイピングを行うためPromiseを返す.thenメソッドを用いて結果を取り出すことができる.(下記の例を参照)

scraper.channel(url)

チャンネル ID を元に,チャンネル紹介ページをスクレイピングする.

  • 引数:
    • id: チャンネル ID.
  • 戻り値: 非同期でスクレイピングを行うためPromiseを返す.thenメソッドを用いて結果を取り出すことができる.

scraper.close()

終了処理.スクレイピングに使用しているPhantomJSを終了させる.最後のスクレイピングが終わった後に,この関数を呼び出さないと,メインプロセスが終わらないことがある.

利用例

例としてscraperコマンドでの呼び出し部分を掲載する.

var scraper = require("youtube-comment-scraper");

scraper.comments(some_url).then(function(res) {
  // 取得したコメントをJSON形式に整形して出力.
  console.log(JSON.stringify(res));

  // 終了処理.
  scraper.close();
});