使用YouTube Data API获取频道视频ID并批量拉取评论的循环报错问题
问题根因
- 调用
commentThreads.list接口时直接传入了视频ID列表作为videoId参数,YouTube Data API要求该参数必须为单个视频ID字符串,不支持批量传入列表,因此触发参数错误 - 原有逻辑未遍历全部视频ID,分页处理、循环嵌套的写法存在语法错误,且未复用已经定义好的
get_comments工具函数 - 未处理API返回的分页token,默认最多只能拿到单页50条评论,无法拉取视频全部评论
search.list接口未配置分页逻辑,最多只能拉取到频道近两周内的50条视频,超出部分无法获取
修正后可运行代码
import os import googleapiclient.discovery import sys import csv import re import json import pandas as pd from datetime import datetime from datetime import timedelta api_service_name = "youtube" api_version = "v3" DEVELOPER_KEY = "替换为你的API密钥" youtube = googleapiclient.discovery.build( api_service_name, api_version, developerKey = DEVELOPER_KEY ) # 计算脚本运行前2周的时间戳 now = datetime.now() weeks_calculated = now + timedelta(weeks=-2) # 拉取指定频道近两周的所有视频ID def get_id(youtube, channelId): video_ids = [] page_token = None while True: response = youtube.search().list( part="id", type='video', channelId=channelId, publishedAfter='{}'.format(weeks_calculated.isoformat("T") + "Z"), pageToken=page_token, maxResults=50 ).execute() # 提取视频ID for item in response['items']: video_ids.append(item['id']['videoId']) # 检查是否有下一页 page_token = response.get('nextPageToken') if not page_token: break return video_ids # 拉取单个视频的所有评论 def get_comments(youtube, videoId): comments = [] page_token = None while True: response = youtube.commentThreads().list( part="snippet,replies", videoId=videoId, order="time", pageToken=page_token, textFormat="plainText", moderationStatus="published", maxResults=100 ).execute() # 提取当前页的顶层评论 for item in response['items']: original = item['snippet']['topLevelComment']['snippet']['textOriginal'] comments.append(original) # 检查是否有下一页 page_token = response.get('nextPageToken') if not page_token: break return comments # 拉取指定频道的所有符合条件视频的评论 def get_channel_all_comments(): channels = [{"id":"UCQlVOYJyQp64rA12ac0mv6g"}] all_comments = [] for channel in channels: # 先拉取频道所有符合条件的视频ID video_ids = get_id(youtube, channel['id']) print(f"共获取到频道{channel['id']}近两周视频{len(video_ids)}个,开始拉取评论...") # 遍历每个视频拉取评论 for vid in video_ids: print(f"正在拉取视频{vid}的评论...") vid_comments = get_comments(youtube, vid) all_comments.extend(vid_comments) print(f"视频{vid}共拉取到{len(vid_comments)}条评论") return all_comments if __name__ == "__main__": comment_text = get_channel_all_comments() # 导出评论到CSV文件 pd.DataFrame({"评论内容": comment_text}).to_csv("youtube频道评论.csv", index=False, encoding="utf-8-sig") print(f"全部拉取完成,共获取到{len(comment_text)}条评论")
注意事项
- YouTube Data API有配额限制,拉取1万条评论大约消耗100配额,默认项目每日配额为1万,超出后会被限制访问24小时
- 部分视频可能关闭了评论功能,遇到报错可以添加异常捕获跳过对应视频
内容的提问来源于stack exchange,提问作者Casey Cushing
相关产品推荐
相关产品推荐

