如何通过Youtube Data API完整获取YouTube视频评论?求助
解决YouTube Data API无法获取全量评论的问题
问题分析
你遇到的核心问题出在代码逻辑上:
- 第一种方法的致命缺陷:递归调用时直接返回后续页结果,没有合并当前页抓取的评论,导致前面页的数据全部丢失;同时
maxResults设为10大幅降低效率,还重复抓取了回复(commentThreads已返回部分回复,又调用comments.list重复获取)。 - 第二种方法的不足:函数参数
video_ids与内部使用的video_id不匹配;仅抓取了commentThreads返回的部分回复,未通过comments.list获取全部回复,导致遗漏大量评论。
YouTube Data API本身没有评论数量限制(只要在配额范围内),只要逻辑正确就能抓取全量数据。
修复后的代码
下面是整合两种方法优点、修复所有问题的版本,可完整抓取所有评论及回复:
def get_all_comments(youtube, video_id): all_comments = [] # 处理顶级评论的分页循环 next_page_token = None while True: # 调用commentThreads,maxResults设为API允许的最大值100 request = youtube.commentThreads().list( part='snippet, replies', videoId=video_id, maxResults=100, pageToken=next_page_token ) response = request.execute() for item in response['items']: # 提取顶级评论数据 top_comment_snippet = item['snippet']['topLevelComment']['snippet'] all_comments.append({ 'video_id': video_id, 'commentId': item['snippet']['topLevelComment']['id'], 'parentId': None, 'username': top_comment_snippet['authorDisplayName'], 'comment': top_comment_snippet['textDisplay'], 'likeCount': top_comment_snippet['likeCount'], 'publishedAt': top_comment_snippet['publishedAt'], 'is_top_level': True }) # 获取该顶级评论的所有回复 total_replies = item['snippet']['totalReplyCount'] if total_replies > 0: reply_next_token = None while True: reply_request = youtube.comments().list( part='snippet', parentId=item['id'], maxResults=100, pageToken=reply_next_token ) reply_response = reply_request.execute() for reply in reply_response['items']: reply_snippet = reply['snippet'] all_comments.append({ 'video_id': video_id, 'commentId': reply['id'], 'parentId': reply_snippet['parentId'], 'username': reply_snippet['authorDisplayName'], 'comment': reply_snippet['textDisplay'], 'likeCount': reply_snippet['likeCount'], 'publishedAt': reply_snippet['publishedAt'], 'is_top_level': False }) reply_next_token = reply_response.get('nextPageToken') if not reply_next_token: break next_page_token = response.get('nextPageToken') if not next_page_token: break return all_comments
关键优化点
- 分页逻辑正确:用循环处理顶级评论和回复的分页,确保所有页数据都合并到结果列表中。
- 避免重复抓取:不再处理
commentThreads返回的replies字段,直接通过comments.list获取所有回复,保证数据完整且无重复。 - 效率提升:
maxResults设为100,减少API调用次数,提升抓取速度。 - 变量名统一:修复参数与内部变量不匹配的问题。
- 数据结构清晰:新增
is_top_level字段区分顶级评论和回复,便于后续数据处理。
使用示例
假设已通过google-api-python-client初始化好youtube客户端,调用方式如下:
# 替换为目标视频ID comments = get_all_comments(youtube, "YOUR_TARGET_VIDEO_ID") print(f"共抓取到 {len(comments)} 条评论")
内容的提问来源于stack exchange,提问作者A fish
相关产品推荐
相关产品推荐

