如何用yt-dlp提取YouTube频道所有视频上传日期并生成JSON?
解决yt-dlp提取YouTube频道视频上传日期的问题
问题说明
用Python调用yt-dlp获取YouTube频道信息时,返回的JSON里没有视频上传日期,但通过Windows终端执行youtube-dl --get-filename -o "%(upload_date)s" www.youtube.com/@4everzyanya却能拿到该信息,需要实现Python版本的对应功能,提取频道所有视频的上传日期并生成JSON。
原因分析
当前代码里的extract_flat: 'in_playlist'参数是核心问题——这个参数会让yt-dlp只提取视频的扁平化基础元数据(比如视频ID、标题),不会请求每个视频的完整详情,自然拿不到upload_date这类需要额外请求的字段。而终端里的youtube-dl命令默认会获取每个视频的完整信息,所以能提取到上传日期。
解决方案
修改yt-dlp的配置选项,去掉extract_flat参数(或设为False),让yt-dlp获取每个视频的完整元数据;同时建议使用频道的视频列表专属URL(比如https://www.youtube.com/@4everZyanya/videos),避免混入Shorts、直播回放等非目标内容。
修改后的代码示例
import json import yt_dlp as youtube_dl # 配置选项:移除extract_flat,确保获取完整视频信息 options = { 'ignoreerrors': True, 'quiet': True, 'dump_single_json': True, # 可选:过滤掉直播、未上线视频和Shorts,只保留常规已上传视频 'match_filter': youtube_dl.utils.match_filter_func('!is_live & !is_upcoming & !is_short') } def get_channel_videos(url): with youtube_dl.YoutubeDL(options) as ydl: # extract_info返回频道完整信息,entries字段为所有视频的列表 channel_info = ydl.extract_info(url, download=False) return channel_info.get('entries', []) # 使用频道的视频列表URL,确保只获取常规视频 videos = get_channel_videos('https://www.youtube.com/@4everZyanya/videos') # 提取每个视频的上传日期及相关标识(可选) upload_dates = [] for video in videos: if video.get('upload_date'): upload_dates.append({ 'video_id': video.get('id'), 'title': video.get('title'), 'upload_date': video.get('upload_date') }) # 生成格式化的JSON文件 with open('channel_upload_dates.json', 'w', encoding='utf-8') as f: json.dump(upload_dates, f, ensure_ascii=False, indent=4) print("上传日期JSON文件已生成")
代码说明
- 移除
extract_flat参数后,yt-dlp会为每个视频请求完整元数据,包含upload_date字段。 match_filter参数用于过滤非目标视频类型,可根据实际需求调整规则。- 最终将提取到的上传日期搭配视频ID、标题保存为JSON文件,便于后续使用。
内容的提问来源于stack exchange,提问作者César Verástegui
相关产品推荐
相关产品推荐

