【发布时间】:2021-08-13 20:24:39
【问题描述】:
我正在使用 pytube 库来下载视频。在本地,我将 pytube 下载功能中的 output_path 变量定向到我希望在本地系统上下载视频的位置。但是,现在由于我使用的是没有存储的 AWS 免费 EC2 实例,因此我对如何将视频直接下载到 s3 存储桶一无所知。在输出路径中提供 s3 uri 不起作用,因为它试图在本地系统上搜索该位置。
我尝试安装 s3 存储桶,然后将 output_path 变量设置为安装位置,但它仍然没有下载视频。脚本执行时没有任何错误,也没有下载视频。
是否有任何解决方案可以让人们使用 pytube 将 youtube 视频直接下载到 s3 存储桶中?非常感谢您的解决方案!
过去的代码:(本地保存文件)
# function safe file name
def safe_filename(s: str, max_length: int = 255) -> str:
# Characters in range 0-31 (0x00-0x1F) are not allowed in ntfs filenames.
ntfs_characters = [chr(i) for i in range(0, 31)]
characters = [r'"',r"\#",r"\$",r"\%",r"'",r"\*",r"\,",r"\.",r"\/",r"\:",r'"',r"\;",r"\<",r"\>",r"\?",r"\\",r"\^",r"\|",r"\~",r"\\\\",r"(",r")"]
pattern = "|".join(ntfs_characters + characters)
regex = re.compile(pattern, re.UNICODE)
filename = regex.sub("", s)
return filename[:max_length].rsplit(" ", 0)[0]
# function simplify name
def simplify(text):
try:
text = unicode(text, 'utf-8')
except NameError:
pass
text = unicodedata.normalize('NFD', text.decode('utf-8')).encode('ascii', 'ignore').decode("utf-8")
return str(text)
def downloader(lnks, threadlabel):
failed=[]
#holds links so that we can retry to download those we missed
for link in lnks:
try:
yt = YouTube(link)
#print(yt.title)
name= safe_filename(yt.title)
name= name.strip()
name= name.encode("utf-8")
name= simplify(name)
name= re.sub('[^A-Za-z0-9]+', '', name)
name= name.replace('[^\w\s]', '')
print(name)
if name + '.mp4' not in os.listdir(r'D:\OneDrive - Indian School of Business\Projects\CEO_Mindset_Master\Data_Repository\YT_Interviews_Data\Videos'):
print(yt.streams.order_by('resolution').desc())
print('----------------------------------------------------------------------------------------')
print(yt.streams.filter(progressive=True, file_extension='mp4', type="video").order_by('resolution').desc().first())
yt.streams.filter(progressive=True, file_extension='mp4', type="video").order_by('resolution').desc().first().download(output_path=r'Videos', filename= name)
else:
print(name, ' done')
pass
except:
print('----------------------', link, 'not downloaded','----------------------')
failed.append(link)
break
if len(failed)!=0:
print(failed)
with open('failed_'+threadlabel+'.txt', 'w+') as f:
f.write(failed)
downloader(['https://www.youtube.com/watch?v=Pk4tE6Jfakg'], 'test')
代码:输出文件路径 s3 URI:
yt.streams.filter(progressive=True, file_extension='mp4', type="video").order_by('resolution').desc().first().download(output_path=S3_URI, filename= name)
代码:输出文件路径挂载的 s3 位置
yt.streams.filter(progressive=True, file_extension='mp4', type="video").order_by('resolution').desc().first().download(output_path='mnt/bucket/folder', filename= name)
【问题讨论】:
-
您为什么认为 AWS 免费套餐 EC2 实例没有存储空间?
-
如果下载到实例的本地磁盘(例如ec2-user主目录,甚至/tmp),是否有效?
-
@jarmod,它有 8GB 的存储空间,我有 100GB 的数据要下载。我的脚本并行运行并下载多个视频,它需要一个存储位置。
-
@JohnRotenstein 是的,如果我将它下载到 home、tmp 或 istance 上的任何其他位置,它就可以工作
-
如果实例默认没有足够的存储空间,那么您可以添加一个 EBS 卷,尽管它可能会超过您的免费套餐。或者,调查您的下载库是否可以将数据流式传输给您,在这种情况下您可以使用 boto3 将其流式传输到 S3,或者查看您的下载库是否可以使用 PUT url 作为目标而不是本地文件系统,那么您可能会能够为目标 S3 对象使用预签名的 PUT URL。
标签: python amazon-web-services amazon-s3 amazon-ec2 pytube