代码:
import os
import requests
from threading import Thread
from urllib.parse import urlparse
class MultiThreadedDownloader:
def __init__(self, urls, download_dir, num_threads=4):
"""
初始化多线程下载器。
参数:
- urls:文件下载链接的列表。
- download_dir:保存下载文件的目录。
- num_threads:使用的线程数量,默认为4。
"""
self.urls = urls
self.download_dir = download_dir
self.num_threads = num_threads
self.threads = []
# 如果下载目录不存在,则创建
if not os.path.exists(download_dir):
os.makedirs(download_dir)
def download_file(self, url):
"""
下载单个文件的函数。
参数:
- url:要下载的文件的URL。
"""
try:
# 获取文件名
file_name = os.path.basename(urlparse(url).path)
file_path = os.path.join(self.download_dir, file_name)
# 发起GET请求下载文件
response = requests.get(url, stream=True)
total_size = int(response.headers.get('content-length', 0))
# 检查文件是否已经存在
if os.path.exists(file_path):
print(f"{file_name} 已经存在,跳过下载。")
return
# 下载并写入文件
with open(file_path, 'wb') as f:
print(f"开始下载: {file_name}")
for data in response.iter_content(chunk_size=1024):
if data:
f.write(data)
print(f"{file_name} 下载完成!")
except Exception as e:
print(f"下载 {url} 失败: {e}")
def start_download(self):
"""
启动多线程下载。
"""
# 分配线程数
for i in range(0, len(self.urls), self.num_threads):
thread_group = self.urls[i:i + self.num_threads]
for url in thread_group:
thread = Thread(target=self.download_file, args=(url,))
thread.start()
self.threads.append(thread)
# 等待当前一组线程完成下载
for thread in self.threads:
thread.join()
def download(self):
"""
启动下载任务并执行多线程下载。
"""
print("开始下载任务...")
self.start_download()
print("所有下载任务完成!")
# 示例用法:
# urls = ['https://example.com/file1.zip', 'https://example.com/file2.zip', 'https://example.com/file3.zip']
# downloader = MultiThreadedDownloader(urls, download_dir='./downloads', num_threads=3)
# downloader.download()
使用说明:
-
功能描述:
这是一个Python编写的多线程文件下载器,可以通过多个线程并行下载多个文件,从而大大提高下载效率。特别适用于需要同时下载多个文件或文件较大时。这个工具非常适合批量下载的需求,例如批量下载图片、视频、数据集文件等。 -
参数说明:
urls
: 传入一个文件下载链接的列表。每个URL都是需要下载的文件地址。download_dir
: 下载文件存储的目录。如果目录不存在,工具会自动创建。num_threads
: 设定使用的线程数量,默认为4。可以根据网络状况调整线程数以提高下载效率。
-
使用示例:
假设你有一个包含多个文件链接的列表,希望将这些文件下载到本地./downloads
文件夹。urls = [ 'https://example.com/file1.zip', 'https://example.com/file2.zip', 'https://example.com/file3.zip' ] downloader = MultiThreadedDownloader(urls, download_dir='./downloads', num_threads=3) downloader.download()
-
功能说明:
- 多线程下载:工具使用了Python的
threading
模块,通过开启多个线程并行下载文件,提高下载速度。你可以控制同时下载的线程数,避免过多线程导致的网络堵塞。 - 下载目录:下载的文件会被保存在你指定的目录中。如果目录不存在,工具会自动创建这个目录。
- 文件名自动提取:工具会从URL中自动提取文件名进行保存。
- 支持断点续传:工具使用
requests
模块发起下载请求,通过流式下载来逐块写入文件。这样做可以避免下载大文件时占用过多内存,并且更适合中断续传。
- 多线程下载:工具使用了Python的
-
依赖项:
- 本工具依赖
requests
模块进行文件下载。你可以通过以下命令安装:pip install requests
os
模块和threading
模块是Python内置模块,不需要额外安装。
- 本工具依赖
-
注意事项:
- 多线程数的选择:线程数的设置依赖于你的网络带宽和下载文件的大小。过多的线程可能会对网络带宽造成压力,反而导致下载速度下降。推荐根据实际情况调整。
- 文件已存在检查:工具会在下载前检查目标文件是否已存在。如果文件已存在,下载会被跳过。
- 异常处理:工具具备基本的异常处理能力,当下载失败时会输出错误信息,帮助用户快速定位问题。
-
使用场景:
- 批量下载资源:可以用来下载课程视频、图片、音频文件等。
- 大文件下载:适用于下载大文件或多个大文件,提高下载效率。
- 数据集下载:可以快速下载各种大规模数据集文件,节省时间。
-
扩展性:
- 可以进一步扩展该工具支持文件的断点续传功能(例如使用
Range
请求)。 - 可以增加下载进度显示,实时显示每个文件的下载进度。
- 可以进一步扩展该工具支持文件的断点续传功能(例如使用
总结:
这个工具通过多线程并行下载文件,能够显著提高下载效率,尤其适合需要同时下载多个文件的场景。它简单易用,适合各种文件下载任务,无论是批量下载小文件,还是下载大文件,都会提供一个快速且高效的解决方案。