如何在Scrapy/Python中无需下载获取YouTube视频大小?含指定链接验证
在Python/Scrapy中无需下载获取YouTube视频大小的方法
Python 通用实现
可以借助pytube库直接提取YouTube视频的流信息,无需下载完整文件即可获取各分辨率对应的视频大小:
- 先安装依赖:
pip install pytube
- 示例代码(支持目标链接
https://youtu.be/hkuUVjlBOVs):
from pytube import YouTube # 目标视频链接 video_url = "https://youtu.be/hkuUVjlBOVs" yt = YouTube(video_url) # 打印音视频一体的混合流信息 print("=== 音视频混合流 ===") for stream in yt.streams.filter(progressive=True): print(f"分辨率: {stream.resolution}, 文件大小: {round(stream.filesize / (1024*1024), 2)} MB") # 打印纯视频流(需单独搭配音频流)信息 print("\n=== 纯视频流 ===") for stream in yt.streams.filter(only_video=True): print(f"分辨率: {stream.resolution}, 文件大小: {round(stream.filesize / (1024*1024), 2)} MB") # 打印纯音频流信息 print("\n=== 纯音频流 ===") for stream in yt.streams.filter(only_audio=True): print(f"编码格式: {stream.abr}, 文件大小: {round(stream.filesize / (1024*1024), 2)} MB")
运行后就能直接得到该视频各流的大小数据,无需下载任何文件。
Scrapy 环境实现
如果要在Scrapy爬虫框架中实现,可直接请求YouTube的player接口解析流信息,示例爬虫代码如下:
import scrapy import json from urllib.parse import urlparse, parse_qs class YouTubeVideoSizeSpider(scrapy.Spider): name = 'youtube_video_size' start_urls = ['https://youtu.be/hkuUVjlBOVs'] def parse(self, response): # 从链接中提取视频ID video_id = parse_qs(urlparse(response.url).query).get('v') if not video_id: video_id = response.url.split('/')[-1] # 构造player接口请求 player_api_url = 'https://www.youtube.com/youtubei/v1/player?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8' request_payload = { "context": { "client": { "clientName": "WEB", "clientVersion": "2.20240520.01.00" } }, "videoId": video_id } yield scrapy.Request( player_api_url, method='POST', body=json.dumps(request_payload), headers={'Content-Type': 'application/json'}, callback=self.parse_stream_data ) def parse_stream_data(self, response): data = json.loads(response.text) # 合并普通流和自适应流数据 all_streams = data.get('streamingData', {}).get('formats', []) + data.get('streamingData', {}).get('adaptiveFormats', []) for stream in all_streams: filesize = stream.get('contentLength') if filesize: yield { 'quality_label': stream.get('qualityLabel'), 'mime_type': stream.get('mimeType'), 'size_mb': round(int(filesize) / (1024*1024), 2) }
运行该爬虫后,Scrapy会输出目标视频所有可用流的分辨率、格式和大小信息,全程无需下载视频文件。
针对目标链接的可行性
链接https://youtu.be/hkuUVjlBOVs完全支持上述两种方法,直接替换示例代码中的URL即可获取该视频的大小数据。
内容的提问来源于stack exchange,提问作者epope
相关产品推荐
相关产品推荐

