Youtube Data API V3获取评论时403错误处理异常求助
解决YouTube Data API V3评论爬取的403错误捕获与重复处理问题
一、先搞定403错误捕获失败的问题
你抓不到错误,大概率是异常类型没导对,或者错误解析逻辑走了弯路。Google API抛出的HttpError是googleapiclient.errors下的,不是普通请求库的HTTPError。
修正步骤:
- 先导入正确的异常类:
from googleapiclient.errors import HttpError import json
- 调整try-except块的错误解析逻辑,直接从错误响应里拿原因:
try: # 你的获取评论代码,比如: comment_response = youtube.commentThreads().list( part="snippet", videoId=video_id, maxResults=100 ).execute() # 处理评论的逻辑... except HttpError as e: # 解析API返回的错误JSON error_data = json.loads(e.content.decode()) error_reason = error_data["error"]["errors"][0]["reason"] # 精准匹配"评论禁用"的错误 if error_reason == "commentsDisabled": print(f"⚠️ 视频 {video_id} 评论已禁用,跳过处理") # 这里一定要标记为已处理 processed_ids.add(video_id) continue # 其他403错误(比如配额用完、权限不足),可以选择抛出或单独处理 else: print(f"❌ 视频 {video_id} 出现其他403错误:{error_reason}") # 如果不想中断脚本,可以continue;如果要终止就raise # raise
二、解决videoId重复处理的问题
重复处理说明你标记已处理的逻辑没生效,要么是没持久化存储,要么是每次脚本重启后丢失了记录。
修正方案:
- 用本地文件持久化已处理的videoId,脚本启动时先加载:
# 初始化已处理ID集合 processed_ids = set() # 启动时读取已处理记录 try: with open("processed_video_ids.txt", "r", encoding="utf-8") as f: for line in f: video_id = line.strip() if video_id: processed_ids.add(video_id) except FileNotFoundError: # 文件不存在就新建,不用管 pass # 遍历视频列表时,先判断是否已处理 for video in all_videos: video_id = video["id"]["videoId"] if video_id in processed_ids: print(f"✅ 视频 {video_id} 已处理过,直接跳过") continue # 这里执行获取评论的逻辑(包含上面的try-except) # 处理完(包括跳过的禁用视频),写入文件 with open("processed_video_ids.txt", "a", encoding="utf-8") as f: f.write(f"{video_id}\n")
三、关键注意点
- 别用
except Exception这种宽泛捕获,会掩盖其他真正的bug(比如API调用参数错误) - 每次处理完一个videoId(不管成功还是跳过),都要写入本地文件,避免脚本中断后重启重复处理
- 如果遇到
quotaExceeded(配额用完)的错误,建议直接终止脚本,不然会一直触发错误
内容的提问来源于stack exchange,提问作者FrancisLehner
相关产品推荐
相关产品推荐

