You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:05:35