Python 您可以同时下载多个文件
我有一个python应用程序,其中有一个包含多个URL的变量 现在我用的是这样的东西:Python 您可以同时下载多个文件,python,python-3.x,youtube-dl,Python,Python 3.x,Youtube Dl,我有一个python应用程序,其中有一个包含多个URL的变量 现在我用的是这样的东西: for v in arr: cmd = 'youtube-dl -u ' + email + ' -p ' + password + ' -o "' + v['path'] + '" ' + v['url'] os.system(cmd) 但这样我只下载了一个又一个视频。我怎样才能同时下载3个视频呢?(不是来自youtube,因此没有播放列表或频道) 我不需要python中
for v in arr:
cmd = 'youtube-dl -u ' + email + ' -p ' + password + ' -o "' + v['path'] + '" ' + v['url']
os.system(cmd)
但这样我只下载了一个又一个视频。我怎样才能同时下载3个视频呢?(不是来自youtube,因此没有播放列表或频道)
我不需要python中的多线程,但需要多次调用youtube dl,拆分数组。因此,从python的角度来看,可以在线程上运行。使用:
是一个轻量级的基于线程的池版本,在这里更合适,因为工作任务只是启动子流程
请注意,不要使用os.system
,这会防止在以前的代码中出现错误
还要注意的是,youtube dl非常强大。在大多数情况下,您实际上不需要自己定义和管理文件名。使用:
是一个轻量级的基于线程的池版本,在这里更合适,因为工作任务只是启动子流程
请注意,不要使用os.system
,这会防止在以前的代码中出现错误
还要注意的是,youtube dl非常强大。在大多数情况下,您实际上不需要自己定义和管理文件名。我使用线程
库实现了同样的功能,这被认为是产生新进程的一种更轻松的方法
假设:
- 每个任务都会将视频下载到不同的目录
导入操作系统
导入线程
导入youtube\u dl
COOKIE\u JAR=“路径\u到我的\u COOKIE\u JAR”
def下载任务(视频、输出目录):
如果不是os.path.isdir(输出目录):
os.makedirs(输出目录)
如果不是os.path.isfile(COOKIE\u JAR):
raise FileNotFoundError(“未找到Cookie Jar\n”)
ydl_opts={
“cookiefile”:COOKIE\u JAR,
'outtmpl':f'{output_dir}/%(title)s.%(ext)s'
}
使用youtube_dl.YoutubeDL(ydl_选项)作为ydl:
下载(视频)
如果名称=“\uuuuu main\uuuuuuuu”:
output_dir=“./root_dir”
线程=[]
对于多个播放列表中的播放列表:
output_dir=f“{output_dir}/playlist.name”
线程=线程。线程(目标=下载任务,参数=(播放列表,输出目录))
附加(线程)
#开始下载
对于线程中的线程:
thread.start()
#等待所有下载完成
对于线程中的线程:
thread.join()
我使用线程化
库实现了同样的效果,这被认为是产生新进程的一种更轻松的方式
假设:
- 每个任务都会将视频下载到不同的目录
导入操作系统
导入线程
导入youtube\u dl
COOKIE\u JAR=“路径\u到我的\u COOKIE\u JAR”
def下载任务(视频、输出目录):
如果不是os.path.isdir(输出目录):
os.makedirs(输出目录)
如果不是os.path.isfile(COOKIE\u JAR):
raise FileNotFoundError(“未找到Cookie Jar\n”)
ydl_opts={
“cookiefile”:COOKIE\u JAR,
'outtmpl':f'{output_dir}/%(title)s.%(ext)s'
}
使用youtube_dl.YoutubeDL(ydl_选项)作为ydl:
下载(视频)
如果名称=“\uuuuu main\uuuuuuuu”:
output_dir=“./root_dir”
线程=[]
对于多个播放列表中的播放列表:
output_dir=f“{output_dir}/playlist.name”
线程=线程。线程(目标=下载任务,参数=(播放列表,输出目录))
附加(线程)
#开始下载
对于线程中的线程:
thread.start()
#等待所有下载完成
对于线程中的线程:
thread.join()
import multiprocessing.dummy
import subprocess
arr = [
{'vpath': 'example/%(title)s.%(ext)s', 'url': 'https://www.youtube.com/watch?v=BaW_jenozKc'},
{'vpath': 'example/%(title)s.%(ext)s', 'url': 'http://vimeo.com/56015672'},
{'vpath': '%(playlist_title)s/%(title)s-%(id)s.%(ext)s',
'url': 'https://www.youtube.com/playlist?list=PLLe-WjSmNEm-UnVV8e4qI9xQyI0906hNp'},
]
email = 'my-email@example.com'
password = '123456'
def download(v):
subprocess.check_call([
'echo', 'youtube-dl',
'-u', email, '-p', password,
'-o', v['vpath'], '--', v['url']])
p = multiprocessing.dummy.Pool(concurrent)
p.map(download, arr)