質問編集履歴

1 target_urlとscrp.text.split(" = ", 1)[1]

macarooon

macarooon score 2

2020/05/21 23:57  投稿

PythonでYouTube Liveのアーカイブからチャットを取得したいけれどうまくいかない
### 前提・実現したいこと
PythonでYoutube Liveのアーカイブからチャットを取得したいです。
こちらのサイトを参考に、コードをそのまま使用しています。
http://watagassy.hatenablog.com/entry/2018/10/08/132939
### 発生している問題・エラーメッセージ
cmdでpyファイル実行後、テキストファイル(comment_data.txt)に何も表示されません。
cmd,Visual Studio Code共にエラーメッセージや問題など発生していません。
解決策が分からなくて困っています。
### 該当のソースコード
```py
from bs4 import BeautifulSoup
import json
import requests
target_url = "https://www.youtube.com/live_chat_replay?continuation=xxxxxxxx"
target_url = "https://www.youtube.com/watch?v=xxxxx(取得したい動画のURL)"
dict_str = ""
next_url = ""
comment_data = []
session = requests.Session()
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
# まず動画ページにrequestsを実行しhtmlソースを手に入れてlive_chat_replayの先頭のurlを入手
html = requests.get(target_url)
soup = BeautifulSoup(html.text, "html.parser")
for iframe in soup.find_all("iframe"):
   if("live_chat_replay" in iframe["src"]):
       next_url= iframe["src"]
while(1):
   try:
   html = session.get(next_url, headers=headers)
       soup = BeautifulSoup(html.text,"lxml")
       # 次に飛ぶurlのデータがある部分をfind_allで探してsplitで整形
       for scrp in soup.find_all("script"):
           if "window[\"ytInitialData\"]" in scrp.text:
               dict_str = scrp.text.split(" = ")[1]
               dict_str = scrp.text.split(" = " , 1)[1]
       # javascript表記なので更に整形. falseとtrueの表記を直す
       dict_str = dict_str.replace("false","False")
       dict_str = dict_str.replace("true","True")
       # 辞書形式と認識すると簡単にデータを取得できるが, 末尾に邪魔なのがあるので消しておく(「空白2つ + \n + ;」を消す)
       dict_str = dict_str.rstrip(" \n;")
       # 辞書形式に変換
       dics = eval(dict_str)
       # "https://www.youtube.com/live_chat_replay?continuation=" + continue_url が次のlive_chat_replayのurl
       continue_url = dics["continuationContents"]["liveChatContinuation"]["continuations"][0]["liveChatReplayContinuationData"]["continuation"]
       next_url = "https://www.youtube.com/live_chat_replay?continuation=" + continue_url
       # dics["continuationContents"]["liveChatContinuation"]["actions"]がコメントデータのリスト。先頭はノイズデータなので[1:]で保存
       for samp in dics["continuationContents"]["liveChatContinuation"]["actions"][1:]:
           comment_data.append(str(samp)+"\n")
   # next_urlが入手できなくなったら終わり
   except:
       break
# comment_data.txt にコメントデータを書き込む
with open("comment_data.txt", mode='w', encoding="utf-8") as f:
   f.writelines(comment_data)
```
### 試したこと
Python 3.8.3です。
BeautifulSoup, requests, lxml インストール済みです。
pip list
Package          Version
----------------- ----------
astroid          2.4.1
beautifulsoup4   4.9.1
bs4              0.0.1
certifi          2020.4.5.1
chardet          3.0.4
colorama         0.4.3
idna             2.9
isort            4.3.21
lazy-object-proxy 1.4.3
lxml             4.5.1
mccabe           0.6.1
pip              20.1.1
pylint           2.5.2
requests         2.23.0
selenium         3.141.0
setuptools       41.2.0
six              1.14.0
soupsieve        2.0.1
toml             0.10.1
urllib3          1.25.9
wrapt            1.12.1
### 補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
  • Python

    38322 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る