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.
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.
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.
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.)
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 ...
API Reference - CommentThreads API Reference - Comments Obtenir des commentaires sur Youtube en Python