如何从YouTube视频接口响应中过滤掉Shorts短视频
解决YouTube爬取时排除Shorts的问题
YouTube Data API的playlistItems接口不会直接将Shorts标记为特殊类型(比如youtube#short),因为Shorts本质属于普通视频范畴。要排除Shorts,你可以通过以下两种可靠方式筛选:
方法一:通过视频时长筛选(最准确)
Shorts的官方定义是60秒及以内的竖屏视频,我们可以调用videos接口获取视频时长,再过滤掉时长≤60秒的内容。
修改后的代码实现
import requests import json from isodate import parse_duration # 需先安装:pip install isodate def get_channel_videos_exclude_shorts(channel_id): PLAYLIST_ID = 'UU' + channel_id[2:] API_KEY = '...' # 替换为你的API密钥 playlist_items_url = f'https://www.googleapis.com/youtube/v3/playlistItems?part=snippet&playlistId={PLAYLIST_ID}&maxResults=50&key={API_KEY}' all_videos = [] page_token = '' # 第一步:获取频道所有视频的完整列表 while True: current_url = playlist_items_url if page_token: current_url += f'&pageToken={page_token}' response = requests.get(current_url).json() if 'items' not in response or not response['items']: break all_videos.extend(response['items']) page_token = response.get('nextPageToken') if not page_token: break # 第二步:批量获取视频时长,筛选排除Shorts video_ids = [item['snippet']['resourceId']['videoId'] for item in all_videos] filtered_videos = [] # 分批次处理(API单次最多支持50个视频ID) for i in range(0, len(video_ids), 50): batch_ids = ','.join(video_ids[i:i+50]) videos_url = f'https://www.googleapis.com/youtube/v3/videos?part=contentDetails&id={batch_ids}&key={API_KEY}' videos_response = requests.get(videos_url).json() for video_item in videos_response.get('items', []): duration = parse_duration(video_item['contentDetails']['duration']).total_seconds() if duration > 60: # 匹配对应的playlistItem数据 matched = [v for v in all_videos if v['snippet']['resourceId']['videoId'] == video_item['id']] if matched: filtered_videos.extend(matched) # 保存筛选后的结果 with open('filtered_videos.json', 'w') as f: json.dump(filtered_videos, f, indent=2) return filtered_videos
方法二:通过视频URL/缩略图特征筛选
Shorts的视频页面URL格式为https://www.youtube.com/shorts/{videoId},部分Shorts的缩略图链接也会带有shorts标识。这种方法无需额外调用API,但可靠性稍低(少数Shorts可能无明显特征)。
示例筛选逻辑(嵌入到第一步获取完整列表后)
filtered_videos = [] for item in all_videos: video_id = item['snippet']['resourceId']['videoId'] # 检查缩略图是否包含Shorts标识 thumbnail_url = item['snippet']['thumbnails']['default']['url'] if 'shorts' not in thumbnail_url: filtered_videos.append(item)
关键修正说明
原代码存在逻辑错误:循环内直接return会仅获取第一页数据,修改后的代码会遍历所有分页,确保拿到频道的完整视频列表。
内容的提问来源于stack exchange,提问作者gengar
相关产品推荐
相关产品推荐

