You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Youtube Data API完整获取YouTube视频评论?求助

解决YouTube Data API无法获取全量评论的问题

问题分析

你遇到的核心问题出在代码逻辑上:

  1. 第一种方法的致命缺陷:递归调用时直接返回后续页结果,没有合并当前页抓取的评论,导致前面页的数据全部丢失;同时maxResults设为10大幅降低效率,还重复抓取了回复(commentThreads已返回部分回复,又调用comments.list重复获取)。
  2. 第二种方法的不足:函数参数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:44:57