我正在尝试开发一个python脚本来下载使用youtube-dl模块从csv文件输入的一堆youtube视频。单个视频的下载失败时脚本停止。我需要脚本继续下载下一个视频而忽略无法下载的视频。有人可以帮我解决如何在python中处理这个问题吗?
答案 0 :(得分:4)
如果您使用的是youtube-dl
命令,则可以使用--ignore-errors
flag。
如果您使用python中的youtube_dl
模块,则必须使用ignoreerrors
parameter:
from __future__ import unicode_literals
import youtube_dl
ydl_opts = {'ignoreerrors': True}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['<URL>'])
答案 1 :(得分:0)
我意识到这是一个老问题,但问题出现了,我找到了一个简单的解决方案。
我认为这里的问题是youtube_dl正在捕获任何出现的错误,然后通过它自己的内部消息输出例程报告它们,因此异常在它到达调用代码之前被“消耗”。这可能适用于命令行实用程序,但在本机python代码中使用它时会产生障碍。幸运的是,youtube_dl的开发人员为我们提供了一种拦截错误消息并处理它们的方法,而无需使用youtube_dl内部。不幸的是,他们对这两个解释和示例都非常清楚,但是如果你查看自述文件的“开发者说明”,就会有一个自定义记录器类的例子。
稍加修改后,我们可以使用此类存储错误消息(或警告,或其他),然后检查它们,而不是使用try / except块:
class MyLogger(object):
def __init__(self):
self._message_queue = []
def debug(self, msg):
print('[DEBUG]' + msg)
def warning(self, msg):
pass
def error(self, msg):
self._message_queue.append(msg)
print(msg)
def get_message(self):
return None if not len(self._message_queue) else \
self._message_queue.pop()
导入记录器类,实例化它,并将其作为参数传递给youtube_dl的选项字符串。
import mylogger
...
loggr = mylogger.MyLogger()
...
ydl_opts = { 'logger': loggr }
现在,当根据出现错误采取行动时,您可以检查记录器对象中的消息队列,看看是否有事情要做:
possible_error = loggr.get_message()
if possible_error is None:
#do normal code
else:
#check the content of the error string and do something with it.
希望这有助于某人。