【问题标题】:Pytube download a video directly to s3 bucket locationPytube 直接将视频下载到 s3 存储桶位置
【发布时间】: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


【解决方案1】:

我建议你:

  1. 使用现有(工作)代码将文件下载到本地磁盘然后
  2. 将文件上传到 Amazon S3 使用 API 和 boto3 库(这是适用于 Python 的 AWS 开发工具包)

即使您将 S3 挂载为磁盘(这通常不是一个好主意)或使用允许在 S3 上引用文件的 Python 库,它仍然需要将数据下载到计算机,然后上传到 S3。分两步完成它更安全、更简单,而不是依赖复杂的实用程序或库来模仿 S3 作为本地存储设备。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 2022-11-19
    • 1970-01-01
    • 2012-01-29
    相关资源
    最近更新 更多