4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

 こんにちは、@kanure24です。
本記事は、 Advent Calendar 2023 - 身の回りの困りごとを楽しく解決! by Works Human Intelligence の22日目として投稿させて頂いております!

今年の僕の困りごとは、何かと話題になったX (旧Twitter)のAPI仕様変更により、研究の方針を変えざるを得ないことでした。そこで、新たなデータ源として、YouTubeのテキストデータを簡単かつ実用的に収集できるなライブラリを作成しました。
本記事では「習うより慣れろ」ということで、10分で実際に手元でYouTubeデータを収集できるような構成としているので、ぜひご覧ください!

コードや記事に対し、間違っている点や疑問点・不明点等ありましたらご連絡いただけると幸いです。

目次

1. 爆速トライ (10分)
2. まとめ (1分)
3. 詳しい使い方 (気になる方向け)

1. 爆速トライ

とにかく使ってみていただきたいので、
(1) ライブラリをインストール
(2) APIキーを取得
(3) コード実行
と最短でYouTubeデータを収集する方法を説明します。

(1) ライブラリをインストール (1分-)

 まず下記のコードを実行します。環境によっては別のライブラリのインストールに時間がかかる場合があるので、先にやってしまいましょう。

# 本ライブラリをインポート
!git clone https://github.com/momijiro/youtube_data_collector
# ディレクトリを変更 (notebookでの実行を想定)
%cd youtube_data_collector
# 関係するライブラリをインストール
!pip install -r requirements.txt

(2) YouTube APIキーを取得 (3-5分程度)

 待っている間に、APIを実行するためのキーを発行します。ちなみにAPIの使用にお金はかかりませんが、1日の制限はあります(後述)。

手順 (Googleアカウントは持っている前提としています)
  1. Google Cloud Plattformにアクセス
  2. プロジェクトの新規作成 -> 選択
  3. 「APIとサービス」の「ライブラリ」に移動
  4. 「YouTube Data API v3」を検索し、有効にする
  5. 「認証情報」の「認証情報を作成」でAPIキーを作成
  6. (必要なら) キー制限をかける
参考サイト (どちらの記事も分かりやすいのでお好みで)

(3) コード実行 (1分-)

 YOUTUBE_API_KEYを自分の取得したAPIキーに修正して実行することで、簡単にデータが収集できます。

# ライブラリをインポート
from ytdc import YouTubeDataCollector, pickup_video_id, update_list

# 実行
YOUTUBE_API_KEY = 'YOUR_API_KEY'  # 自分の API キーに置き換えてください
collector = YouTubeDataCollector(
        api_key=YOUTUBE_API_KEY,
        mode='movie',
        save=False,
        args = {
            'start': '2008-01',
            'end': '2008-01',
            'query': 'あけましておめでとう',
        }
)
collector.run()
df_movie = collector.df
df_movie

本コードでは、「あけましておめでとう」を含む2008年1月の動画データが収集できます。 ちなみに、quota (後述)を消費しすぎないように2008年としています。

結果のイメージ (※実データではありません)

video_id title description publish_time channel_title
ab12cd あけましておめでとう動画 日の出の動画です 2008-01-01T01:23:45Z Helloworld
zy34xw 新年あけましておめでとう ハッピーニューイヤー! 2008-01-01T23:45:00Z Dummies

このように、動画のタイトル、概要、公開日時、チャンネル名を取得できます。その他、コメント、視聴回数、高評価数等も取得できます (後述)。

2. まとめ

 早いですが、ここで一旦まとめです。実際に手を動かしてくださった方は、ここまでで意外と簡単にYouTubeデータを収集できることを知っていただけたのではないでしょうか?

本記事で一番伝えたいことは以上ですが、より詳しく使ってみたい方は引き続きご覧ください!

3. 詳しい使い方

 続いて本章では実用面として、機能性・汎用性・実践面の3つに分けて紹介したいと思います! ※ 本ライブラリの詳しい仕様は Githubのdocsをご覧ください。

チャンネルを指定したい

 mode='movie'で、args'query'の代わりに'channel_id'を用います。

collector = YouTubeDataCollector(
        api_key=YOUTUBE_API_KEY,
        mode='movie',
        save=True,
        args = {
            'start': '2008-01',
            'end': '2008-01',
            'channel_id': 'specify_channel_id',
        }
)
collector.run()
df_movie = collector.df
df_movie

ただし、'channel_id'は、'ChannelTitle'や「@」で始まるものではなく、そのチャンネルに固有のランダムな英数字です。 こちらの方の記事を使わせていただくと、チャンネルURLを入力することで取得できます。

コメントを集めたい

 コメントを集める場合は、先にmode='movie'で実行し、そのデータからvideo_id_listを作成する必要があります。

df_movie = collector.df   # mode='movie'での実行結果
video_id_list = pickup_video_id(df_movie)

このvideo_id_listを用いて、mode='comment'としてコメントを収集します。

collector = YouTubeDataCollector(
        api_key=YOUTUBE_API_KEY,
        mode='comment',
        save=True,
        args={'video_id_list': video_id_list}
)
collector.run()
df_comment = collector.df
df_comment

このようなコメントデータを取得できます。(イメージ)
現状の仕様では、低評価数は全て0となるので取得していません。

video_id comment like_count publish_time author_id
ab12cd めでたいなぁ 5 2008-01-02T10:20:30Z AAAAAAAAAabbbbbbbCC
ab12cd 今年もよろしく 2 2013-01-23T12:34:56Z DDDDDDDeeeeeeeeffffGG

高評価数や視聴数を集めたい

 高評価数、視聴数等はcommentモードと同様にvideo_id_listを指定し、mode='stats'とすることで実行できます。

collector = YouTubeDataCollector(
        api_key=YOUTUBE_API_KEY,
        mode='stats',
        save=True,
        args={'video_id_list': video_id_list}
)
collector.run()
df_stats = collector.df
df_stats

データとしてもこんな感じです。

video_id View_count like_count comment_count
ab12cd 33333 3 1
zy34xw 4321 1 0

データを保存したい

 save=Trueとすると、以下のようにデータを保存することができます。(デフォルトではoutputフォルダを作成)

  • movie -> output/movie/あけましておめでとう_2008-01_2008-01.csv
  • comment -> output/comment/comment_lastvideoid.csv
  • stats -> output/stats/stats_lastvideoid.csv

save_pathにより保存先フォルダ、file_nameによりファイル名を指定することができます。 (厳密には、ファイル名の後半部分は変更できないようにしてあります。詳しくはdocsやコードをご覧ください。)

クエリを詳しく指定したい

 キーワード(query)は自由に設定可能で、複数羅列する場合は半角スペースで区切ります。Twitter API等と同様に、以下のようにANDORを用いて検索することもできます。

'query': '(今日 OR 明日) AND (晴れ OR 雨)'

この例では、「今日・晴れ」を含む動画、「今日・雨」を含む動画、「明日・晴れ」を含む動画、「明日・雨」を含む動画が収集されます。

日付を指定したい

 動画の収集期間は、startendで単位が同じなら、年・月・日のどれでも取得可能です。

(例) 2010年から2012年のデータを収集したい場合

start end 保存名の例
'2010' '2010' キーワード_2010_2012.csv
'2010-01' '2010-12' キーワード_2010-01_2012-12.csv
'2010-01-01' '2010-12-31' キーワード_2010-01-01_2012-12-31.csv

上記の3パターンはどれも結果としては(原理上)同じになります。なので、長期間のデータを収集する場合は、API効率の観点からなるべく大きい単位 (年・月) を使用してください。 (詳しくは:quotaとは)

ヒット数が多いデータを収集したい

 ある程度ヒット数が大きいデータを取得しようとすると、quotaが1日の上限を超え、複数回(日)に渡って収集しなければいけないことがあります。本ライブラリでは、ファイルの保存名の語尾 (.csvの前) により「どこまで収集したか」を表しているので、その次から収集することで無駄なく実行することができます。

mode ファイル名の語尾 (例) 語尾の意味 次回実行時
'movie' ~_2012.csv 何年 (何月・何日)まで収集したか startを変更して実行
'comment' ~_lastvideoid.csv どのvideo_idまで収集したか video_id_listを更新して実行(※)
'stats' ~_lastvideoid.csv どのvideo_idまで収集したか video_id_listを更新して実行(※)

※ ちなみに、以下の関数によりvideo_id_listを更新する事ができます。

last_id = 'LastSavedVideoId'
video_id_list = update_list(video_id_list, last_id)

quotaとは

 YouTube APIには「quota」というチャージの概念があり、1日あたり10,000 quota与えられています (公式: API概要)。 ただし、modeごとに消費量が異なります。

mode 1リクエストあたり消費量 公式サイトでの記載方法 1日あたりの最大取得数(※)
'movie' 100 quota 検索-list 100年(月・日)分の動画
'comment' 1 quota コメントスレッド-list 10,000動画のコメント
'stats' 1 quota 動画-list 10,000動画の統計量

この仕組みにより、注意すべき点は2つあります。

  1. movieモードでは、同じ期間でも指定の仕方によって消費量が変わる

     本ライブラリで年・月・日を指定できる仕様にしているのは、なるべく大きい単位で実行し、quota効率を上げるためです。例えば、2020年から2022年の3年分の動画データを取得する際の消費quotaは以下のようになり、同じ期間でも大きく変わることが分かります。

    start end リクエスト数 最低quota消費量 (※) 取得にかかる最短日数
    2020 2022 1*3=3 100*3=300 quota 1日
    2020-01 2022-12 12*3=36 100*36=3,600 quota 1日
    2020-01-01 2022-12-31 365*3=1095 100*1095=11万 quota 11日
  2. 検索でヒットするデータ数は、検索条件によって大きく異なる

     例えば、レシピ動画を探そうとしたとき、条件を絞り込んだほうがヒット数は少なくなることは容易に想像できると思います。以下のレシピのようにヒット数が1,000件もあると、1回のリクエストで全てのデータを収集できず、同じ条件で何度もリクエストする必要があります。

    query ヒット数(イメージ) 再リクエスト
    レシピ 1,000 あり
    レシピ AND キャベツ AND 豚肉 AND 時短 30 なし

このように、大量のデータを収集するためにはquota効率が重要になります。続いて「どれくらいで再リクエストするのか?」を説明します。

※ 1日あたりの「最大取得数」、1リクエストあたりの「最低quota消費量」は、再リクエストがない場合の取得数・消費quotaであることを意味しています。

再リクエストとは

 前章でも述べましたが、ヒット数が多い場合、1回のリクエストで全てを取得することはできません。1回のリクエストで取得できるデータ数( maxResults )は50ですが、50件を超える結果はざらにあります(公式: Search関数)。
そこで、50件を超える時には「PageToken」というもので「まだ続くよ」とAPIが教えてくれます( Twitter API等でも同様の仕組みがあると思います)。

 本ライブラリではその仕組みを用いて、PageTokenがある限り再リクエストする仕様としています。 例えば、先程の「レシピ」の例では、ヒットする動画数が1,000件なので、合計1000/50=20より20回リクエストを行います。本ライブラリでは、リクエスト回数(request_count)を表示するようにしているので、参考にしてみてください。

quotaは増やせないか?

 quotaの一日の上限は 10,000quota (動画取得リクエスト100回分、コメント10,000回分)です。この制限内でなるべく多くのデータを収集するため、本ライブラリではquota効率を重視し作成しています。
一方で、quotaを増やせないの?と思う方はいらっしゃると思います。答えはYesで、YouTubeに申請フォームを出し承認されれば増やせるようなので、詳しくは公式やその他の方の記事をご参照ください。しかし僕の場合は以下の3点から結局上限解除はしていません。

  • 意外とステップが面倒くさい
  • 上限解除に関する情報量があまり多くない
  • 使用するquota数を申請するために本ライブラリを実装したら、自身の研究ではデータ数的に不要と気づいた

研究・サービス内容によっては上限解除申請をしたほうが良い場合も多々あると思いますので、本記事がその判断の一助となれば幸いです。

全体像のまとめ

 最後に、全体のまとめとしてコードの構造やモード間の違いについてここでまとめておきます。

YouTubeDataCollector のディレクトリ構成

youtube_data_collector
├── docs                # ライブラリの実行に関係する文書まとめ (英語)
│   ├── note.md         # 実行に関わる補足・注意点等
│   └── usage.md        # 詳しい使用方法
├── docs_ja             # ライブラリの実行に関係する文書まとめ (日本語)
│   ├── note_ja.md
│   └── usage_ja.md
├── LICENSE             # ライセンス
├── README.md           # 概要
├── requirements.txt    # 依存関係
├── setup.py            # セットアップ
└── ytdc
    ├── __init__.py     # 初期化
    └── ytdc.py         # メインコード

モードによる違い

mode movie comment stats
argsで指定 start, end,
query, channel_id
video_id_list video_id_list
アウトプット 動画のメタデータ 動画のコメント 動画の統計量データ
実行タイミング 最初 movie実行後 movie実行後
保存フォルダ output/movie output/comment output/stats
保存名 (例) キーワード_2010_2010.csv comment_lastvideoid.csv stats_lastvideoid.csv
リクエスト数 n 回以上 (※1,2) video_id 回以上 (※1) video_id
1リクエストの消費quota 100 1 1

※1 再リクエストがない場合のリクエスト数
※2 nは、n年・n月・n日と「何単位あるか」を表す

最後に

 長くなりましたが、ここまで読んでくださりありがとうございます。
このライブラリが少しでも皆さんのお役に立てると幸いです。もし良かったら記事のいいね等くださると励みになります。

最後に、注意点を述べさせていただきます。 (詳しくはGitHubコードに記載)

  • 本コードは、2023年12月時点で実装したものです。必要に応じて最新の情報を確認してください。(公式サイト)
  • APIキーの取得・本ライブラリの使用等による損失・損害については、一切責任を負いかねますので、公式の情報を確認しつつ自己責任で行ってください。
  • 問題・不明点等ありましたら、お気軽にお問い合わせください。

ここまでお付き合いいただきありがとうございました!
連絡先: X(Twitter)

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?