使用Google API爬取YouTube数据时遇HttpError 400错误求助
YouTube API获取视频详情报错排查与解决
问题描述
拥有100+个YouTube视频ID,需要获取每个视频的标题、播放量、点赞数等详情,此前运行正常的Python代码突然报错。
示例ID列表:
video_id=['GGHiHodljug','PY8cEyi2MzM','QTCcJipjgxI']
原获取视频详情函数代码:
def get_video_details(youtube, video_id): all_video_stats = [] for i in video_ids: request = youtube.videos().list(part='snippet,statistics',id=video_id) response = request.execute() for video in response['items']: video_stats = dict(Title = video['snippet']['title'], Published_date = video['snippet']['publishedAt'], Views = video['statistics']['viewCount'], Likes = video['statistics']['likeCount'], #Dislikes = video['statistics']['dislikeCount'], Comments = video['statistics']['commentCount'] #Shares = video['statistics'][''] ) all_video_stats.append(video_stats) return all_video_stats
调用函数video_details = get_video_details(youtube,video_id)时返回错误:
HttpError: <HttpError 400 when requesting returned "The request specifies an invalid filter parameter.". Details: "[{'message': 'The request specifies an invalid filter parameter.', 'domain': 'youtube.parameter', 'reason': 'invalidFilters', 'location': 'parameters.', 'locationType': 'other'}]">
错误分析
- 变量名错误:函数参数定义为
video_id,但循环中使用了未定义的video_ids,导致每次请求都传递了完整的100+个视频ID列表 - API限制触发:YouTube Data API的
videos.list接口规定,id参数最多允许一次性传入50个视频ID,当传入数量超过限制时,会返回invalidFilters错误
修复方案
- 修正变量名错误,确保循环遍历传入的视频ID列表
- 对视频ID列表进行分批处理,每批最多50个ID,批量发起请求以符合API限制
- 增加字段缺失的容错处理,避免因部分视频缺少统计字段导致报错
修复后的完整代码
def get_video_details(youtube, video_ids): all_video_stats = [] # 分批处理,每批最多50个ID(API限制) batch_size = 50 for i in range(0, len(video_ids), batch_size): batch = video_ids[i:i+batch_size] # 将批量ID用逗号拼接,符合API参数要求 request = youtube.videos().list( part='snippet,statistics', id=','.join(batch) ) response = request.execute() for video in response['items']: # 容错处理:避免字段缺失导致KeyError snippet = video.get('snippet', {}) statistics = video.get('statistics', {}) video_stats = { 'Title': snippet.get('title', 'N/A'), 'Published_date': snippet.get('publishedAt', 'N/A'), 'Views': int(statistics.get('viewCount', 0)), 'Likes': int(statistics.get('likeCount', 0)), 'Comments': int(statistics.get('commentCount', 0)) } all_video_stats.append(video_stats) return all_video_stats
使用说明
调用修复后的函数时,确保传入的参数名称与函数定义一致:
video_details = get_video_details(youtube, video_id)
内容的提问来源于stack exchange,提问作者vigneshwaran sr
相关产品推荐
相关产品推荐

