pytube获取stream下载地址 云函数直传阿里云OSS无本地下载方案
错误原因
你的代码报错是因为把stream.download这一pytube内置的「下载文件到本地磁盘」的方法对象传给了requests.get,requests.get要求接收字符串类型的链接,自然会报类型不匹配的错误。
核心实现逻辑
- 获取视频真实下载地址:pytube的
Stream对象自带url属性,直接读取stream.url即可拿到对应的视频资源直链,不需要调用download()方法 - 不落地上传OSS:直接请求拿到视频的二进制内容,再调用OSS的
put_object接口上传即可,不需要在本地生成临时文件
修改后可运行的代码
import time import requests import oss2 from datetime import datetime from pytube import YouTube import pytz # 初始化YouTube对象并获取指定清晰度的流 yt = YouTube('https://www.youtube.com/watch?v=xLiRkW5Qjy4') stream = yt.streams.get_by_itag(22) # 生成时间前缀、初始化OSS客户端 t = datetime.fromtimestamp(int(time.time()), pytz.timezone('Asia/Shanghai')).strftime('%Y-%m-%d %H.%M.%S') auth = oss2.Auth('替换为你的AccessKey','替换为你的AccessKeySecret') bucket = oss2.Bucket(auth, 'https://oss-cn-XXXX.aliyuncs.com', '替换为你的桶名') # 直接请求视频资源获取二进制内容 video_content = requests.get(stream.url, timeout=120).content # 文件名用YouTube视频标题,替换掉特殊字符避免OSS路径报错 file_name = yt.title.replace('/', '_').replace('\\', '_').replace(':', '_') # 上传到OSS bucket.put_object(f"{t}/{file_name}.mp4", video_content)
注意事项
- 你原来的代码缺少
time、requests依赖导入,需要补充 - 原代码中
name变量未定义,这里直接用YouTube自带的视频标题作为文件名,同时做了特殊字符替换避免OSS路径识别异常 - 可以根据云函数的超时限制调整
requests.get的timeout参数,避免大视频下载超时
内容的提问来源于stack exchange,提问作者Blazing
相关产品推荐
相关产品推荐

