如何通过Youtube Data API获取多个视频ID的评论?
如何通过YouTube API批量获取多个视频的评论列表
问题背景
你尝试通过拼接多个视频ID的方式调用commentThreads.list接口,但返回了videoNotFound错误。你的视频ID列表:
video_ids = [ 'QSWYyoF79oE', 'Wh66ThpxvI4', 'weG-sqHHCB8', '8dgEh5crj0I', 'SydRcrZ166A', 'Svz5F8J1Ap0', 'Lj_zPn3GsjE', 'g89VhNDBrsY', ]
错误代码:
request = youtube.commentThreads().list(part='snippet, replies', videoId= ','.join(video_ids), maxResults = 50) response = request.execute()
返回错误:
returned "The video identified by the
videoIdparameter could not be found.". Details: "[{'message': 'The video identified by thevideoIdparameter could not be found.', 'domain': 'youtube.commentThread', 'reason': 'videoNotFound', 'location': 'videoId', 'locationType': 'parameter'}]"
错误原因
YouTube Data API的commentThreads.list接口不支持在单个请求中传入多个videoId参数。你拼接的字符串会被API当作一个完整的视频ID去查找,自然无法匹配到有效视频,因此返回videoNotFound错误。
解决方法
1. 循环遍历单个请求(最直接方案)
遍历视频ID列表,对每个ID单独调用API获取评论,同时处理分页逻辑(如果评论超过50条):
video_ids = [ 'QSWYyoF79oE', 'Wh66ThpxvI4', 'weG-sqHHCB8', '8dgEh5crj0I', 'SydRcrZ166A', 'Svz5F8J1Ap0', 'Lj_zPn3GsjE', 'g89VhNDBrsY', ] all_comments = [] for video_id in video_ids: try: # 初始请求获取第一页评论 request = youtube.commentThreads().list( part='snippet, replies', videoId=video_id, maxResults=50 ) response = request.execute() # 收集当前视频的评论 all_comments.extend(response.get('items', [])) # 处理分页,直到没有下一页 while 'nextPageToken' in response: next_request = youtube.commentThreads().list( part='snippet, replies', videoId=video_id, maxResults=50, pageToken=response['nextPageToken'] ) response = next_request.execute() all_comments.extend(response.get('items', [])) except Exception as e: print(f"视频 {video_id} 评论获取失败: {str(e)}") print(f"累计获取评论数: {len(all_comments)}")
2. 批量请求优化(提升效率)
如果视频数量较多,可使用YouTube API的批量请求功能,将多个API调用打包成一个HTTP请求发送,减少网络开销:
from googleapiclient.http import BatchHttpRequest video_ids = [ 'QSWYyoF79oE', 'Wh66ThpxvI4', 'weG-sqHHCB8', '8dgEh5crj0I', 'SydRcrZ166A', 'Svz5F8J1Ap0', 'Lj_zPn3GsjE', 'g89VhNDBrsY', ] all_comments = [] # 定义批量请求的回调函数 def batch_callback(request_id, response, exception): if exception: print(f"请求 {request_id} 失败: {str(exception)}") else: all_comments.extend(response.get('items', [])) # 创建批量请求对象 batch = youtube.new_batch_http_request(callback=batch_callback) # 为每个视频ID添加请求到批量任务 for video_id in video_ids: request = youtube.commentThreads().list( part='snippet, replies', videoId=video_id, maxResults=50 ) batch.add(request, request_id=video_id) # 执行批量请求 batch.execute() # 注意:批量请求仅处理第一页评论,若需获取全部评论,仍需针对单视频单独处理分页 print(f"累计获取评论数: {len(all_comments)}")
注意事项
- 配额限制:每个
commentThreads.list请求(包括批量请求中的子请求)会消耗1个API配额单位,需控制每日请求量避免超出配额。 - 异常处理:部分视频可能关闭评论、已删除或存在权限限制,需在代码中捕获异常,避免循环中断。
- 分页逻辑:单视频评论超过50条时,必须通过
nextPageToken获取后续页的评论。
内容的提问来源于stack exchange,提问作者A fish
相关产品推荐
相关产品推荐

