Python requests下载文件的几种常用方法(附代码)

 更新时间:2025年03月05日 10:56:32   作者:microhex  
这篇文章主要介绍了五种下载方式的实现方法,包括基础下载、大文件分块下载、带有断点续传的下载、带有超时和重试的下载以及完整的下载器实现,文中给出了详细的代码示例,需要的朋友可以参考下

1. 基础下载:

import requests

def download_file(url, save_path):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        with open(save_path, 'wb') as f:
            f.write(response.content)
        return True
    return False

# 使用示例
url = "https://example.com/file.pdf"
download_file(url, "file.pdf")


2. 大文件分块下载:

import requests
from tqdm import tqdm

def download_large_file(url, save_path):
    response = requests.get(url, stream=True)
    if response.status_code == 200:
        file_size = int(response.headers.get('content-length', 0))
        
        # 显示进度条
        progress = tqdm(response.iter_content(chunk_size=8192), 
                       total=file_size,
                       unit='B', 
                       unit_scale=True)
        
        with open(save_path, 'wb') as f:
            for data in progress:
                f.write(data)
        return True
    return False

3. 带有断点续传的下载:

import requests
import os

def resume_download(url, save_path):
    # 获取已下载文件大小
    initial_pos = os.path.getsize(save_path) if os.path.exists(save_path) else 0
    
    # 设置 Header
    headers = {'Range': f'bytes={initial_pos}-'}
    
    response = requests.get(url, stream=True, headers=headers)
    
    # 追加模式打开文件
    mode = 'ab' if initial_pos > 0 else 'wb'
    with open(save_path, mode) as f:
        for chunk in response.iter_content(chunk_size=8192):
            if chunk:
                f.write(chunk)

4. 带有超时和重试的下载:

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import time

def download_with_retry(url, save_path, max_retries=3, timeout=30):
    session = requests.Session()
    
    # 设置重试策略
    retries = Retry(total=max_retries,
                   backoff_factor=1,
                   status_forcelist=[500, 502, 503, 504])
    
    session.mount('http://', HTTPAdapter(max_retries=retries))
    session.mount('https://', HTTPAdapter(max_retries=retries))
    
    try:
        response = session.get(url, stream=True, timeout=timeout)
        with open(save_path, 'wb') as f:
            for chunk in response.iter_content(chunk_size=8192):
                if chunk:
                    f.write(chunk)
        return True
    except Exception as e:
        print(f"Download failed: {str(e)}")
        return False


5. 完整的下载器实现:

import requests
from tqdm import tqdm
import os
from pathlib import Path
import hashlib

class FileDownloader:
    def __init__(self, chunk_size=8192):
        self.chunk_size = chunk_size
        self.session = requests.Session()
        
    def get_file_size(self, url):
        response = self.session.head(url)
        return int(response.headers.get('content-length', 0))
    
    def get_file_hash(self, file_path):
        sha256_hash = hashlib.sha256()
        with open(file_path, "rb") as f:
            for byte_block in iter(lambda: f.read(4096), b""):
                sha256_hash.update(byte_block)
        return sha256_hash.hexdigest()
    
    def download(self, url, save_path, verify_hash=None):
        save_path = Path(save_path)
        
        # 创建目录
        save_path.parent.mkdir(parents=True, exist_ok=True)
        
        # 获取文件大小
        file_size = self.get_file_size(url)
        
        # 设置进度条
        progress = tqdm(total=file_size,
                       unit='B',
                       unit_scale=True,
                       desc=save_path.name)
        
        try:
            response = self.session.get(url, stream=True)
            with save_path.open('wb') as f:
                for chunk in response.iter_content(chunk_size=self.chunk_size):
                    if chunk:
                        f.write(chunk)
                        progress.update(len(chunk))
            
            progress.close()
            
            # 验证文件完整性
            if verify_hash:
                downloaded_hash = self.get_file_hash(save_path)
                if downloaded_hash != verify_hash:
                    raise ValueError("File hash verification failed")
                    
            return True
            
        except Exception as e:
            progress.close()
            print(f"Download failed: {str(e)}")
            if save_path.exists():
                save_path.unlink()
            return False
            
    def download_multiple(self, url_list, save_dir):
        results = []
        for url in url_list:
            filename = url.split('/')[-1]
            save_path = Path(save_dir) / filename
            success = self.download(url, save_path)
            results.append({
                'url': url,
                'success': success,
                'save_path': str(save_path)
            })
        return results

# 使用示例
downloader = FileDownloader()

# 单文件下载
url = "https://example.com/file.pdf"
downloader.download(url, "downloads/file.pdf")

# 多文件下载
urls = [
    "https://example.com/file1.pdf",
    "https://example.com/file2.pdf"
]
results = downloader.download_multiple(urls, "downloads")

总结 

到此这篇关于Python requests下载文件的几种常用方法的文章就介绍到这了,更多相关Python requests下载文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python机器学习基础特征工程算法详解

    python机器学习基础特征工程算法详解

    这篇文章主要为大家介绍了python机器学习基础特征工程的算法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2021-11-11
  • Mac中pyenv的安装与使用教程

    Mac中pyenv的安装与使用教程

    pyenv支持linux下python多版本的共存和版本之间切换,非常方便,下面这篇文章主要给大家介绍了关于Mac中pyenv安装与使用的相关资料,需要的朋友可以参考下
    2022-02-02
  • Python2和Python3读取文本文件的区别及说明

    Python2和Python3读取文本文件的区别及说明

    这篇文章主要介绍了Python2和Python3读取文本文件的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Python yield的用法实例分析

    Python yield的用法实例分析

    这篇文章主要介绍了Python yield的用法,结合实例形式分析了Python yield的基本功能、使用方法及操作注意事项,需要的朋友可以参考下
    2020-03-03
  • 简单了解Python下用于监视文件系统的pyinotify包

    简单了解Python下用于监视文件系统的pyinotify包

    这篇文章主要介绍了Python下用于监视文件系统的pyinotify包,pyinotify基于inotify事件驱动机制,需要的朋友可以参考下
    2015-11-11
  • Python实现的破解字符串找茬游戏算法示例

    Python实现的破解字符串找茬游戏算法示例

    这篇文章主要介绍了Python实现的破解字符串找茬游戏算法,简单分析了找茬游戏的原理,并结合具体实例形式分析了Python实现破解找茬游戏的相关实现技巧,需要的朋友可以参考下
    2017-09-09
  • Python字符串格式化str.format()方法的实现

    Python字符串格式化str.format()方法的实现

    字符串的格式化是一个非常重要的功能,用于创建包含变量值的字符串,本来就来介绍一下Python字符串格式化str.format()方法的实现,感兴趣的可以了解一下
    2023-11-11
  • Python实现线性搜索算法的示例代码

    Python实现线性搜索算法的示例代码

    线性搜索算法,也称为顺序搜索算法,是一种简单但常用的搜索技术,在本文中,将深入研究线性搜索算法,并演示如何在 Python 中实现它,需要的可以参考下
    2024-02-02
  • python requests完成接口文件上传的案例

    python requests完成接口文件上传的案例

    这篇文章主要介绍了python requests完成接口文件上传的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 全面介绍python中很常用的单元测试框架unitest

    全面介绍python中很常用的单元测试框架unitest

    这篇文章主要介绍了python中很常用的单元测试框架unitest的相关资料,帮助大家更好的利用python进行单元测试,感兴趣的朋友可以了解下
    2020-12-12

最新评论