Python 多线程文件下载器

代码:
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()
使用说明:
  1. 功能描述
    这是一个Python编写的多线程文件下载器,可以通过多个线程并行下载多个文件,从而大大提高下载效率。特别适用于需要同时下载多个文件或文件较大时。这个工具非常适合批量下载的需求,例如批量下载图片、视频、数据集文件等。

  2. 参数说明

    • urls: 传入一个文件下载链接的列表。每个URL都是需要下载的文件地址。
    • download_dir: 下载文件存储的目录。如果目录不存在,工具会自动创建。
    • num_threads: 设定使用的线程数量,默认为4。可以根据网络状况调整线程数以提高下载效率。
  3. 使用示例
    假设你有一个包含多个文件链接的列表,希望将这些文件下载到本地 ./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()
    
  4. 功能说明

    • 多线程下载:工具使用了Python的threading模块,通过开启多个线程并行下载文件,提高下载速度。你可以控制同时下载的线程数,避免过多线程导致的网络堵塞。
    • 下载目录:下载的文件会被保存在你指定的目录中。如果目录不存在,工具会自动创建这个目录。
    • 文件名自动提取:工具会从URL中自动提取文件名进行保存。
    • 支持断点续传:工具使用requests模块发起下载请求,通过流式下载来逐块写入文件。这样做可以避免下载大文件时占用过多内存,并且更适合中断续传。
  5. 依赖项

    • 本工具依赖requests模块进行文件下载。你可以通过以下命令安装:
      pip install requests
      
    • os模块和threading模块是Python内置模块,不需要额外安装。
  6. 注意事项

    • 多线程数的选择:线程数的设置依赖于你的网络带宽和下载文件的大小。过多的线程可能会对网络带宽造成压力,反而导致下载速度下降。推荐根据实际情况调整。
    • 文件已存在检查:工具会在下载前检查目标文件是否已存在。如果文件已存在,下载会被跳过。
    • 异常处理:工具具备基本的异常处理能力,当下载失败时会输出错误信息,帮助用户快速定位问题。
  7. 使用场景

    • 批量下载资源:可以用来下载课程视频、图片、音频文件等。
    • 大文件下载:适用于下载大文件或多个大文件,提高下载效率。
    • 数据集下载:可以快速下载各种大规模数据集文件,节省时间。
  8. 扩展性

    • 可以进一步扩展该工具支持文件的断点续传功能(例如使用Range请求)。
    • 可以增加下载进度显示,实时显示每个文件的下载进度。
总结:

这个工具通过多线程并行下载文件,能够显著提高下载效率,尤其适合需要同时下载多个文件的场景。它简单易用,适合各种文件下载任务,无论是批量下载小文件,还是下载大文件,都会提供一个快速且高效的解决方案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值