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

如何在Scrapy/Python中无需下载获取YouTube视频大小?含指定链接验证

在Python/Scrapy中无需下载获取YouTube视频大小的方法

Python 通用实现

可以借助pytube库直接提取YouTube视频的流信息,无需下载完整文件即可获取各分辨率对应的视频大小:

  1. 先安装依赖:
pip install pytube
  1. 示例代码(支持目标链接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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 03:55:28