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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:30:01