4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

なりかくんAdvent Calendar 2023

Day 14

[14日目] PythonでYouTubeライブのコメントデータを取得する

Posted at

こんにちは、なりかくんと申します。
この記事はなりかくん Advent Calender 2023の14日目の記事です。

今日は、PythonでYouTubeライブのコメントデータを取得するコードを紹介していこうと思います。

YouTubeのデータを取得するライブラリ

まず最初にYouTubeのデータを取得するために、yt-dlpというライブラリを利用します。

インストールは、pipコマンドで行う事が出来ます。

pip install -U yt-dlp

yt-dlpの基本を触る

まず最初にyt-dlpの基礎から触れておきます。
このライブラリでは、YouTube上の動画のダウンロードを行う事が出来ます。
ダウンロードするコードは以下のコードです。

from yt_dlp import YoutubeDL

videoUrl = "https://www.youtube.com/watch?v=psMKkDa61_E"
with YoutubeDL({'format': 'best'}) as ydl:
    ydl.download([videoUrl])

このコードを実行すると、動画のダウンロードをすぐに行う事が出来ます。
image.png

私の環境では、3時間の動画を5分程度でダウンロード出来ました。クソ長い動画でも非常に早くでダウンロードできるのが非常に良い点ですね。

ダウンロード先の指定

このままだとPythonの実行したフォルダーに保存されるので、ユーザーのダウンロードフォルダーに保存するようにします。
ダウンロードパスはos標準モジュールを利用して、以下のコードで取得できます。

from os.path import expanduser
folderPath = expanduser("~") + "\\Downloads"

また、yt-dlpは以下のようになります。

from yt_dlp import YoutubeDL
from os.path import expanduser

folderPath = expanduser("~") + "\\Downloads"
videoUrl = "https://www.youtube.com/watch?v=psMKkDa61_E"

with YoutubeDL({'format': 'best', 'outtmpl': folderPath + '/%(id)s.mp4'}) as ydl:
    ydl.download([videoUrl])

YouTubeライブのコメント取得

では、次に本題のコメントデータを取得するコードです。
コメントデータを取得するには、writesubtitlesオプションを有効化すれば取れるみたいです。原理はわからないです。
また、動画データが不要な場合はskip_downloadを有効化すれば大丈夫です。
これらを踏まえたコードがこちらになります。

from yt_dlp import YoutubeDL
from os.path import expanduser

folderPath = expanduser("~") + "\\Downloads"
videoUrl = "https://www.youtube.com/watch?v=psMKkDa61_E"

with YoutubeDL({
        'format': 'best',
        'outtmpl': folderPath + '/%(id)s.mp4',
        'writesubtitles': True,
        'skip_download': True
    }) as ydl:
    ydl.download([videoUrl])

実行すれば、このように取得することが出来ます。

image.png

ダウンロードしたコメントデータはこのようなデータです。1行ごとにデータが入っている感じですね。
image.png

コメントデータのコメントだけを取り出す

今のままだと1行ごとにJSONが入っていて扱いにくい状態です。もういっそのことコメント内容だけを取り出ししてしまえ!ということで、各行のJSONをパースして出力するコードが以下になります。

from yt_dlp import YoutubeDL
from os.path import expanduser
import json

folderPath = expanduser("~") + "\\Downloads"
videoUrl = "https://www.youtube.com/watch?v=psMKkDa61_E"

with YoutubeDL({
        'format': 'best',
        'outtmpl': folderPath + '/%(id)s.mp4',
        'writesubtitles': True,
        'skip_download': True
    }) as ydl:
    res = ydl.extract_info(videoUrl, download=False)
    ydl.download([videoUrl])

file = open(folderPath + "\\" + str(res["id"]) + ".live_chat.json", "r", encoding="UTF-8")
data = file.read()
lines = str(data).split("\n")
for line in lines:
    if line == "":
        continue
    lJson = json.loads(line)
    jAction = lJson["replayChatItemAction"]["actions"][0]
    if "addChatItemAction" in jAction:
        jItem = jAction["addChatItemAction"]["item"]
        if "liveChatTextMessageRenderer" in jItem:
            commentContent = jItem["liveChatTextMessageRenderer"]["message"]["runs"][0]["text"]
            print(str(commentContent))

出力結果は以下のようになります。

image.png

活用すれば

これを活用すれば、各時間にどのぐらいのコメント数があるのかなどをグラフ化することが出来ます。これから何記事かこのネタで持たそうと思います。

最後までお読みいただきありがとうございました。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?