[PYTHON] Tout lire, y compris les commentaires et réponses sur les vidéos YouTube

J'ai essayé d'obtenir tous les commentaires, y compris les réponses des vidéos YouTube avec un script python

Problème de commentaire vidéo YouTube illisible

Certaines vidéos YouTube contiennent parfois étrangement de nombreux commentaires, mais si vous essayez de les lire à partir de votre navigateur ou de votre application,

Arrêtez.

Ça s'arrête juste. Même si j'allume le feu après un long moment avec un PC, le navigateur s'arrête parfaitement.

Lire avec l'API / Script YouTube

Il semble y avoir une API YouTube pratique à ces moments-là, et de nombreux scripts ont déjà été publiés. Cependant, je n'ai rien trouvé qui puisse obtenir tous les commentaires, alors j'ai essayé d'obtenir tous les commentaires, y compris la réponse.

scénario

getComments.py



import datetime
import json
import requests

URL = 'https://www.googleapis.com/youtube/v3/'
API_KEY = 'xxx'
VIDEO_ID = 'yyy'

def get_video_comment(video_id, n):
    try:
        next_page_token
    except NameError:
        params = {
            'key': API_KEY,
            'part': 'replies, snippet',
            'videoId': VIDEO_ID,
            'order': 'time',
            'textFormat': 'plaintext',
            'maxResults': n,
        }
    else:
        params = {
            'key': API_KEY,
            'part': 'replies, snippet',
            'videoId': VIDEO_ID,
            'order': 'time',
            'textFormat': 'plaintext',
            'pageToken': next_page_token,
            'maxResults': n,
        }
    response = requests.get(URL + 'commentThreads', params=params)
    resource = response.json()
    return resource

def print_video_comment_replies(match):
    for comment_info in match['items']:
        author = comment_info['snippet']['authorDisplayName']
        pubdate = comment_info['snippet']['publishedAt']
        text = comment_info['snippet']['textDisplay']
        pubdate = datetime.datetime.strptime(pubdate, '%Y-%m-%dT%H:%M:%SZ')
        pubdate = pubdate.strftime("%Y/%m/%d %H:%M:%S")
        print('\t___________________________________________\n')
        print("\n\tReply :\n\t{}\n\n\tby: {} date: {}".format(text, author, pubdate), "\n")

def print_video_comment(match):
    global parentId
    for comment_info in match['items']:
        parentId = comment_info['id']
        author = comment_info['snippet']['topLevelComment']['snippet']['authorDisplayName']
        pubdate = comment_info['snippet']['topLevelComment']['snippet']['publishedAt']
        text = comment_info['snippet']['topLevelComment']['snippet']['textDisplay']
        like_cnt = comment_info['snippet']['topLevelComment']['snippet']['likeCount']
        reply_cnt = comment_info['snippet']['totalReplyCount']
        pubdate = datetime.datetime.strptime(pubdate, '%Y-%m-%dT%H:%M:%SZ')
        pubdate = pubdate.strftime("%Y/%m/%d %H:%M:%S")
        print('---------------------------------------------------\n')
        print('{}\n\n by: {} date: {} good: {} reply: {}\n'.format(text, author, pubdate, like_cnt, reply_cnt))
        if reply_cnt > 0:
            replyMatch = treat_reply(match)
            print_video_comment_replies(replyMatch)
            global reply_next_page_token
            try:
                reply_next_page_token = replyMatch["nextPageToken"]
            except KeyError:
                pass
            else:
                while 'reply_next_page_token' in globals():
                    replyMatch = treat_reply(match)
                    print_video_comment_replies(replyMatch)
                    try:
                        reply_next_page_token = replyMatch["nextPageToken"]
                    except KeyError:
                        reply_next_page_token = None
                        del reply_next_page_token
            reply_next_page_token = None
            del reply_next_page_token

def treat_reply(match):
    for comment_info in match['items']:
        try:
            comment_info['replies']
        except KeyError:
            pass
        else:
            try:
                reply_next_page_token
            except NameError:
                params = {
                 'key': API_KEY,
                 'part': 'id, snippet',
                 'parentId': parentId,
                 'textFormat': 'plaintext',
                 'maxResults': 100,
                 'order': 'time',
                }
            else:
                params = {
                 'key': API_KEY,
                 'part': 'id, snippet',
                 'parentId': parentId,
                 'textFormat': 'plaintext',
                 'maxResults': 100,
                 'order': 'time',
                 'pageToken': reply_next_page_token,
                }
            response = requests.get(URL + 'comments', params=params)
            resource = response.json()
            return resource


# Main

key = None

while 'key' in locals():
    match = get_video_comment(VIDEO_ID, 100)
    print_video_comment(match)
    try:
        next_page_token = match["nextPageToken"]
    except KeyError:
        next_page_token = None
        del next_page_token
        del key

Définissez correctement les variables API_KEY et VIDEO_ID dans le script. VIDEO_ID est l'URL de la vidéo.

point

Je le fait. Eh bien, comme il est écrit dans le manuel ...

https://developers.google.com/youtube/v3/docs/commentThreads#resource

To retrieve all of the replies for the top-level comment, you need to call the comments.list method and use the parentId request parameter to identify the comment for which you want to retrieve replies.

Je voulais basculer entre les commentaires -> les réponses aux commentaires dans le processus principal, mais je ne pouvais que penser à définir le paramètre CommentThreads maxResults sur 1, ce qui émettrait des API pour le nombre de commentaires. Ce serait ridicule (ou assez en colère dans certains cas) de le faire, donc il a une structure légèrement insatisfaisante d'appeler la fonction de réponse de commentaire dans print_video_comment (). La variable reply_next_page_token est réutilisée entre les fonctions, une déclaration globale est donc requise. (J'en étais accro sans m'en apercevoir au début.)

Autre

La méthode de vérification de l'existence des variables n'est pas unifiée dans le script, mais ne vous inquiétez pas ...

référence

API Reference - CommentThreads API Reference - Comments Obtenir des commentaires sur Youtube en Python

Recommended Posts

Tout lire, y compris les commentaires et réponses sur les vidéos YouTube
Obtenez des commentaires sur youtube Live avec [python] et [pytchat]!