YouTube V3 API仅获取顶级评论,无法获取回复问题求助
问题排查与修复
你的代码无法获取评论回复的核心原因是调用commentThreads.list时没有指定replies字段作为返回的part。YouTube API默认不会返回回复数据,必须显式声明要获取replies部分;同时,单条顶级评论的回复可能分页,需要额外处理分页逻辑才能拿到全部回复。
具体修复步骤
1. 修改API请求的part参数
将commentThreads().list中的part='snippet'改为part='snippet,replies',这样API才会返回每个顶级评论对应的回复数据。
2. 处理回复的分页
默认情况下,API单次返回的单条顶级评论回复数量最多为100条,如果回复超过这个数量,需要通过nextPageToken循环调用comments.list接口获取剩余回复。
修改后的完整代码
import os import csv import googleapiclient.discovery # 填入你的API密钥 API_KEY = 'API KEY' # 初始化YouTube API客户端 youtube = googleapiclient.discovery.build('youtube', 'v3', developerKey=API_KEY) def get_all_comments(video_id): all_comments = [] # 获取所有顶级评论线程(处理分页) next_page_token = None while True: response = youtube.commentThreads().list( part='snippet,replies', # 必须包含replies才能获取回复数据 videoId=video_id, textFormat='plainText', pageToken=next_page_token, maxResults=100 # 单次请求最多获取100条顶级评论,提升效率 ).execute() for item in response['items']: # 添加顶级评论数据 comment_data = item['snippet']['topLevelComment']['snippet'] comment_data['authorChannelId'] = comment_data.get('authorChannelId', {}).get('value', None) all_comments.append(comment_data) # 获取该顶级评论的所有回复(处理回复分页) if 'replies' in item: replies_next_page_token = None while True: replies_response = youtube.comments().list( part='snippet', parentId=item['id'], textFormat='plainText', pageToken=replies_next_page_token, maxResults=100 ).execute() for reply_item in replies_response['items']: reply_data = reply_item['snippet'] reply_data['authorChannelId'] = reply_data.get('authorChannelId', {}).get('value', None) all_comments.append(reply_data) if 'nextPageToken' in replies_response: replies_next_page_token = replies_response['nextPageToken'] else: break if 'nextPageToken' in response: next_page_token = response['nextPageToken'] else: break return all_comments def save_comments_to_csv(comments, file_path): if not comments: print("未采集到任何评论数据") return with open(file_path, 'w', encoding='utf-8', newline='') as csvfile: fieldnames = comments[0].keys() csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames) csv_writer.writeheader() for comment in comments: csv_writer.writerow(comment) if __name__ == "__main__": video_id = 'video_id' # 填入目标视频ID comments = get_all_comments(video_id) custom_location = 'youtube_comments.csv' # 使用合法文件路径,避免空格或特殊字符 save_comments_to_csv(comments, custom_location) print(f"共采集到 {len(comments)} 条评论") print(f"评论已保存至 '{custom_location}'")
额外注意事项
maxResults参数上限为100,设置后能减少请求次数,提升采集效率- 保存CSV的路径建议使用无空格、无特殊字符的合法路径,避免文件保存失败
- 部分顶级评论可能没有回复,需通过
if 'replies' in item判断后再处理
内容的提问来源于stack exchange,提问作者Kate FitzGerald
相关产品推荐
相关产品推荐

