使用YouTube Data API抓取视频评论仅返回20余条如何解决
问题原因
- YouTube Data API v3的
commentThreads.list接口采用分页返回机制,单次请求默认最多返回20条评论线程,就算手动设置maxResults参数,单次请求最大也只能返回100条,剩余的内容必须携带上一次请求返回的nextPageToken参数再次发起请求,才能拿到下一页的数据。你的代码仅发起了一次请求,只能获取到第一页的20条左右结果。 - 现有代码还存在逻辑bug:遍历回复时错误地重复添加主评论到结果列表,每一条回复都会多存入一次主评论,没有正确存入回复内容。
修复后的代码
from googleapiclient.discovery import build # 存储所有评论的列表,也可改为函数返回值避免使用全局变量 l = [] def remove_URL(text): # 保留你原有去除链接的逻辑即可 return text def video_comments(video_id, api_key): replies = [] # 初始化YouTube资源对象 youtube = build('youtube', 'v3', developerKey=api_key) # 分页token,首次请求无需传入 page_token = None while True: # 发起请求时携带分页token,设置maxResults为100减少请求次数 video_response = youtube.commentThreads().list( part='snippet,replies', videoId=video_id, maxResults=100, pageToken=page_token ).execute() # 处理当前页的所有评论 for item in video_response['items']: # 提取主评论内容 comment = item['snippet']['topLevelComment']['snippet']['textDisplay'] replycount = item['snippet']['totalReplyCount'] # 提取该条主评论的所有回复 if replycount > 0: for reply in item['replies']['comments']: reply_text = reply['snippet']['textDisplay'] replies.append(reply_text) # 处理主评论后存入列表 comment = remove_URL(comment) l.append(comment) # 处理所有回复后存入列表 for resp in replies: resp = remove_URL(resp) l.append(resp) # 清空回复列表处理下一条主评论 replies = [] # 检查是否还有下一页数据,没有则退出循环 page_token = video_response.get('nextPageToken') if not page_token: break # 调用示例 # api_key = "你的YouTube Data API密钥" # target_video_id = "目标视频的ID(注意不是完整链接)" # video_comments(target_video_id, api_key)
主要修改说明
- 新增分页循环逻辑,每次请求后检查是否存在
nextPageToken,存在就携带该token发起下一次请求,直到所有页数据都拉取完成 - 修复了回复存入的错误逻辑,将原本重复添加主评论的代码改为存入处理后的回复内容
- 新增
maxResults=100参数,最大化单次请求返回的评论数量,减少请求次数 - 注意函数参数需要传入的是视频ID而非完整YouTube链接,如果你之前传的是完整链接,需要先从链接中提取出视频ID再传入函数
内容的提问来源于stack exchange,提问作者Abhishek Jha
相关产品推荐
相关产品推荐

