YouTube API V3错误中断我的脚本,即使使用了Try和Except
我正在尝试通过YouTube的API获取一个频道所有视频的评论,具体是使用YouTube API数据V3。不过,我遇到了一个错误,这个错误发生在某个视频的评论被禁用时。我想让我的代码忽略这个错误,继续处理其他视频。
我遇到的错误是:
<HttpError 403 when requesting https://youtube.googleapis.com/youtube/v3/commentThreads?part=id%2Csnippet%2Creplies&maxResults=5&order=relevance&videoId=4Tcsg6tU3ow&key=AIzaSyAPFiPIYO4oIRSyPTEUjPl7XGJYte-JkfI&alt=json returned "The video identified by the <code><a href="/youtube/v3/docs/commentThreads/list#videoId">videoId</a></code> parameter has disabled comments.". Details: "[{'message': 'The video identified by the <code><a href="/youtube/v3/docs/commentThreads/list#videoId">videoId</a></code> parameter has disabled comments.', 'domain': 'youtube.commentThread', 'reason': 'commentsDisabled', 'location': 'videoId', 'locationType': 'parameter'}]">
这个错误是可以预料的,但我在代码的异常处理部分使用了一个代码块,想让程序忽略这个视频ID,然而当程序遇到这个错误时,它还是会被中断。此外,我还遇到过一些情况,程序会访问这个视频ID,打印出错误信息并忽略它,然后又再访问这个视频ID,结果又中断了脚本,尽管这个视频ID已经在处理过的视频ID列表中,不应该再被处理。
以下是我认为在这个情况下很重要的代码片段:
for video_id in videoMetadata:
videoId = video_id['videoId']
publish_date = dt.strptime(video_id['publish_date'], "%Y-%m-%dT%H:%M:%SZ")
if videoId not in processed_video_ids:
try:
print(f"Processing comments for video ID: {videoId}")
comment_threads(videoId, to_csv=True)
# Block of Code for file moving Removed
except requests.exceptions.HTTPError as e:
# Check if the exception is due to a 403 error (Forbidden or Disabled Comments)
if e.response.status_code == 403:
error_message = e.response.json()["error"]["errors"][0]['reason']
if error_message == 'commentsDisabled':
print("Comments are disabled for this video. Skipping this request.")
else:
print(f"403 Forbidden: {error_message}. Skipping this request.")
else:
# Handle other HTTP errors
print(f"HTTP error occurred: {e}")
except requests.exceptions.RequestException as e:
# Handle other exceptions (e.g., network errors)
print(f"Error making API request: {e}")
processed_video_ids.add(videoId)
另外,我的脚本在遇到错误时似乎从来不会打印出字符串,这让我觉得我的脚本在获取API提供的错误信息时可能有问题。
1 个回答
0
找到了解决办法。谷歌的API有自己处理错误请求的方式,所以不是用:
except requests.exceptions.HTTPError as e:
而是用:
except googleapiclient.errors.HttpError as e:
try:
error_content = e.content.decode('utf-8')
error_data = json.loads(error_content)
你可以用下面的方式来查看错误代码:
error.resp.status == 'ERROR CODE HERE'