質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.36%

PythonでYoutube Liveのアーカイブからチャットを取得したい

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 500

score 0

前提・実現したいこと

PythonでYoutube Liveのアーカイブからチャットを取得したいです。
こちらの質問のソースコードを参照しています。
https://teratail.com/questions/276731

発生している問題

pyファイルをcmdから実行し、エラーメッセージが返ってきます。
作成されるJSONファイル(タイトル名.Json)を開いても中身が空っぽです。

エラーメッセージ

SyntaxError
invalid syntax (<unknown>, line 1)
Comment data saved to タイトル名.json

該当のソースコード

#!/usr/bin/env python3
from bs4 import BeautifulSoup
import ast
import requests
import re
import sys
import requests
import requests_html # <= 追加

# Verify user supplied a YouTube URL.
#if len(sys.argv) == 1:
#   print("Please provide a YouTube URL (e.g. ./YoutubeChatReplayCrawler.py YOUTUBE_VIDEO_URL)")
#   sys.exit(0)
# Produce a valid filename (from Django text utils).
def get_valid_filename(s):
   s = str(s).strip().replace(' ', '_')
   return re.sub(r'(?u)[^-\w.]', '', s)
# Set up variables for requests.
#target_url = sys.argv[1]
target_url = "https://www.youtube.com/watch?dummyID" #←適当に選んだ動画のURL
dict_str = ''
next_url = ''
comment_data = []
# session = requests.Session() この行を↓に置き換え
session = requests_html.HTMLSession()
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
# Get the video page.
html = session.get(target_url)
# soup = session.get(target_url) この行を↓に置き換え
resp = session.get(target_url)
resp.html.render(sleep=3)  # <= 追加。レンダリングを完了させるため3秒待ちます。
# soup = BeautifulSoup(html.text, 'html.parser')  <= ここは不要なのでコメントアウトする。
# Retrieve the title and sanitize so it is a valid filename.
# title = soup.find_all('title') この行を↓に置き換え
title = resp.html.find('title')
title = title[0].text.replace(' - YouTube', '')
title = get_valid_filename(title)
# Regex match for emoji.
RE_EMOJI = re.compile('[\U00010000-\U0010ffff]', flags=re.UNICODE)
# Find any live_chat_replay elements, get URL for next live chat message.
# for iframe in soup.find_all("iframe"):
#     if("live_chat_replay" in iframe["src"]):
#         next_url = iframe["src"]
# この3行を↓に置き換え
for iframe in resp.html.find("iframe"):
    if "live_chat_replay" in iframe.attrs["src"]:
        next_url = "".join(["https://www.youtube.com", iframe.attrs["src"]])
if not next_url:
   print("Couldn't find live_chat_replay iframe. Maybe try running again?")
   sys.exit(0)
# TODO - We should fail fast if next_url is empty, otherwise you get error:
# Invalid URL '': No schema supplied. Perhaps you meant http://?
# TODO - This loop is fragile. It loops endlessly when some exceptions are hit.
while(1):
   try:
       html = session.get(next_url, headers=headers)
       soup = BeautifulSoup(html.text, 'lxml')
       # Loop through all script tags.
       for script in soup.find_all('script'):
           script_text = str(script)
           if 'ytInitialData' in script_text:
               dict_str = ''.join(script_text.split(" = ")[1:])
       # Capitalize booleans so JSON is valid Python dict.
       dict_str = dict_str.replace("false", "False")
       dict_str = dict_str.replace("true", "True")
       # Strip extra HTML from JSON.
       dict_str = re.sub(r'};.*\n.+<\/script>', '}', dict_str)
       # Correct some characters.
       dict_str = dict_str.rstrip(" \n;")
       # TODO: I don't seem to have any issues with emoji in the messages.
       # dict_str = RE_EMOJI.sub(r'', dict_str)
       # Evaluate the cleaned up JSON into a python dict.
       dics = ast.literal_eval(dict_str)
       # TODO: On the last pass this returns KeyError since there are no more
       # continuations or actions. Should probably just break in that case.
       continue_url = dics["continuationContents"]["liveChatContinuation"]["continuations"][0]["liveChatReplayContinuationData"]["continuation"]
       print('Found another live chat continuation:')
       print(continue_url)
       next_url = "https://www.youtube.com/live_chat_replay?continuation=" + continue_url
       # Extract the data for each live chat comment.
#         for samp in dics["continuationContents"]["liveChatContinuation"]["actions"][1:]:
# これだと、チャットデータのブロックごとに最初の行が欠落するため、下記のようにする。
       for samp in dics["continuationContents"]["liveChatContinuation"]["actions"]:
           comment_data.append(str(samp) + "\n")
   # next_urlが入手できなくなったら終わり
   except requests.ConnectionError:
       print("Connection Error")
       continue
   except requests.HTTPError:
       print("HTTPError")
       break
   except requests.Timeout:
       print("Timeout")
       continue
   except requests.exceptions.RequestException as e:
       print(e)
       break
   except KeyError as e:
       error = str(e)
       if 'liveChatReplayContinuationData' in error:
           print('Hit last live chat segment, finishing job.')
       else:
           print("KeyError")
           print(e)
       break
   except SyntaxError as e:
       print("SyntaxError")
       print(e)
       break
       # continue #TODO
   except KeyboardInterrupt:
       break
   except Exception:
       print("Unexpected error:" + str(sys.exc_info()[0]))
# Write the comment data to a file named after the title of the video.
with open(title + ".json", mode='w', encoding="utf-8") as f:
   f.writelines(comment_data)
print('Comment data saved to ' + title + '.json')

試したこと

  1. 関連した質問から実施項目を検討しました。
    https://teratail.com/questions/263421?link=qa_related_pc
    https://teratail.com/questions/278254?link=qa_related_pc
    https://teratail.com/questions/297389?link=qa_related_pc
    https://teratail.com/questions/275236?link=qa_related_pc
  2. bs4(BeautifulSoup)に不具合があると考え、バージョンを確認し再インストールを実施しました。
    pip list
    Package                  Version
    ------------------------ -----------
    appdirs                  1.4.4
    beautifulsoup4           4.9.3
    bs4                      0.0.1
    cachetools               4.1.1
    certifi                  2020.6.20
    chardet                  4.0.0
    cssselect                1.1.0
    decorator                4.4.2
    fake-useragent           0.1.11
    ffmpeg                   1.4
    ffmpeg-python            0.2.0
    future                   0.18.2
    google-api-core          1.22.1
    google-api-python-client 1.10.0
    google-auth              1.20.1
    google-auth-httplib2     0.0.4
    googleapis-common-protos 1.52.0
    httplib2                 0.18.1
    idna                     2.10
    lxml                     4.6.2
    parse                    1.16.0
    pip                      21.0
    protobuf                 3.13.0
    py                       1.9.0
    pyasn1                   0.4.8
    pyasn1-modules           0.2.8
    pyee                     7.0.2
    pyppeteer                0.2.2
    pyquery                  1.4.1
    pytz                     2020.1
    requests                 2.25.1
    requests-html            0.10.0
    retry                    0.9.2
    rsa                      4.6
    selenium                 3.141.0
    setuptools               41.2.0
    six                      1.15.0
    soupsieve                2.0.1
    tqdm                     4.48.2
    uritemplate              3.0.1
    urllib3                  1.26.3
    w3lib                    1.22.0
    websockets               8.1
    youtube-dl               2021.1.24.1
  3. リファレンスの確認
    http://kondou.com/BS4/
    https://www.crummy.com/software/BeautifulSoup/

補足情報(FW/ツールのバージョンなど)

  • ver Microsoft Windows [Version 10.0.19041.746]
  • python --version Python 3.8.3
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る