如何在YT Data API v3爬取时跳过无videoId的JSON对象
解决YT Data API v3爬取时跳过非视频对象的问题
问题根源
YouTube Search API的search端点默认会返回多种类型的结果(视频、频道、播放列表),哪怕指定了channelId,也可能混入频道类条目——这类条目的id字段只有channelId,没有videoId,直接访问会导致代码抛出KeyError中断。
两种解决方案
方案1:API请求直接过滤视频(推荐)
在请求URL里添加type=video参数,让API只返回视频类型的结果,从源头避免非视频条目:
limit = 5 video_Ids = [] nextPageToken ="" #for 0th iteration let it be null for i in range(limit): # 添加type=video参数,限定仅返回视频结果 url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}&type=video" data = json.loads(requests.get(url).text) for item in data['items']: video_Id = item['id']['videoId'] video_Ids.append(video_Id) nextPageToken = data['nextPageToken']
方案2:代码内跳过非视频条目
如果不想修改API请求,就在循环里检查id字典是否包含videoId,不包含则直接跳过:
limit = 5 video_Ids = [] nextPageToken ="" #for 0th iteration let it be null for i in range(limit): url = f"https://www.googleapis.com/youtube/v3/search?key={api_key}&part=snippet&channelId={channel_Id}&maxResults=50&pageToken={nextPageToken}" data = json.loads(requests.get(url).text) for item in data['items']: # 检查当前条目是否为视频类型 if 'videoId' in item['id']: video_Id = item['id']['videoId'] video_Ids.append(video_Id) nextPageToken = data['nextPageToken']
补充说明
方案1更高效,因为API不会返回多余的非视频数据,能减少带宽消耗和后续处理逻辑。如果后续需要同时获取其他类型数据,再用方案2针对性过滤即可。
内容的提问来源于stack exchange,提问作者BeaverFever
相关产品推荐
相关产品推荐

