如何使用youtube-dl仅下载缩略图?

10

我一直在尝试下载我拥有的URL列表(YouTube视频)的缩略图。

我一直在使用youtube-dl,到目前为止我已经解决了这个问题:

     import os

     with open('results.txt') as f:
          for line in f:
              os.system("youtube-dl " + "--write-thumbnail " + line)

我可以这样下载缩略图,但同时也被迫下载了YouTube视频。

我该如何只下载缩略图?


https://docs.python.org/3.8/library/subprocess.html 更适合启动命令。 - qwr
你知道youtube-dl是用Python编写的,对吧? - Shiplu Mokaddim
你可以使用在线工具获取YouTube缩略图 https://www.workversatile.com/youtube-thumbnail-downloader - Arshad Shaikh
4个回答

27
你可以在你的代码中简单添加 --skip-download,它就能正常工作。像这样:

您只需要在代码中加入 --skip-download 即可。

with open('urls.txt') as f:
for line in f:
    os.system("youtube-dl "+"--write-thumbnail "+"--skip-download "+line)

13

在其他答案的基础上,您还可以指定-a--batch-file标志来提供要从中导入的文件列表,这会使代码变得更简单:

youtube-dl -a urls.txt --write-thumbnail --skip-download


1
Python 3.6+
import os

with open('urls.txt') as urls:
    for url in urls:
        os.system(f"youtube-dl --write-thumbnail --skip-download {url}")

Python 2.7 (已弃用)

import os

with open('urls.txt') as urls:
    for url in urls:
        os.system("youtube-dl --write-thumbnail --skip-download " + url)

你的Python 2.7解决方案在Python 3.x上同样有效(不仅限于Python 3.6+)。 - pts
+ url替换为+ __import__('pipes').quote(url)以防止shell注入攻击,例如在urls.txt中的; rm -rf ~ / - pts

0

看起来传递 --list-thumbnails 将返回缩略图图像的 URL,但在调用 os.system() 时它只会输出到屏幕。

以下示例可能不是最美观的,但它是使用 subprocess 快速获取 youtube-dl 输出并将其解析为 URL 并使用 requests 下载的工作示例:

import re
import requests
import subprocess

with open('results.txt') as f:
    for line in f:
        proc = subprocess.Popen(['youtube-dl', '--list-thumbnails', line], stdout=subprocess.PIPE)
        youtubedl_output, err = proc.communicate()
        imgurl = re.search("(?P<url>https?://[^\s]+)", youtubedl_output).group('url')
        r = requests.get(imgurl)
        if r.status_code == 200:
            with open(imgurl.split('/')[4] + '.jpg', 'wb') as file:
                for chunk in r.iter_content(1024):
                    file.write(chunk)

希望这有所帮助!

我在运行这个时候出现了一些错误。你有没有在示例上运行过,而且一切正常?而且,我似乎也不太理解你在imgurl上做了什么。谢谢! - TheOlDirtyBastard
抱歉,我处理得太快了。我在Windows上使用PyCharm时可以运行它,但在阅读您的评论后尝试在Linux上运行它时出现了以下错误。AttributeError: 'NoneType' object has no attribute 'group'我错误地添加了shell=True,这是我的坏习惯。这里不需要它,删除它可以修复错误。我还能让代码更简洁一些。我忘记了proc.communicate返回一个元组。解包它可以跳过一点不必要的解析[:-4]。我已经编辑了代码并进行了更正。希望这次能成功! - Casey Wireman
非常顺利地完成了。非常感谢。我现在已经明白了!干杯 :) - TheOlDirtyBastard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接