python 下载文件

作者: adm 分类: python 发布时间: 2025-02-04

在 Python 中下载文件可以通过多种方式实现,以下是 6 种常见方法,涵盖标准库和第三方库,适用于不同场景:

1. 使用 urllib.request(Python 内置库)

python

import urllib.request

url = "https://example.com/file.zip"
save_path = "downloaded_file.zip"

urllib.request.urlretrieve(url, save_path)
print(f"文件已保存到: {save_path}")

特点:

无需安装第三方库,适合简单下载。
不支持断点续传和复杂请求头。
2. 使用 requests 库(推荐)

python

import requests

url = "https://example.com/file.zip"
save_path = "downloaded_file.zip"

response = requests.get(url, stream=True)
with open(save_path, "wb") as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)
print("下载完成!")

优势:

支持 分块下载(大文件友好)。
可添加请求头、代理、Cookie 等。
安装:pip install requests
3. 下载大文件(带进度条)

结合 tqdm 显示下载进度:

python

import requests
from tqdm import tqdm

url = "https://example.com/large_file.iso"
save_path = "large_file.iso"

response = requests.get(url, stream=True)
total_size = int(response.headers.get("content-length", 0))

with open(save_path, "wb") as f, tqdm(
    desc=save_path,
    total=total_size,
    unit="B",
    unit_scale=True,
) as bar:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)
        bar.update(len(chunk))

效果:

large_file.iso: 100%|█████████| 256M/256M [00:10<00:00, 25.6MB/s]

4. 异步下载(aiohttp + asyncio)

适合批量高速下载:

python

import aiohttp
import asyncio

async def download_file(url, save_path):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            with open(save_path, "wb") as f:
                while True:
                    chunk = await response.content.read(8192)
                    if not chunk:
                        break
                    f.write(chunk)

urls = ["https://example.com/file1.zip", "https://example.com/file2.zip"]
tasks = [download_file(url, f"file_{i}.zip") for i, url in enumerate(urls)]

asyncio.run(asyncio.gather(*tasks))

安装:pip install aiohttp

5. 断点续传

python

import os
import requests

url = "https://example.com/big_file.zip"
save_path = "big_file.zip"

if os.path.exists(save_path):
    downloaded_size = os.path.getsize(save_path)
else:
    downloaded_size = 0

headers = {"Range": f"bytes={downloaded_size}-"}
response = requests.get(url, headers=headers, stream=True)

mode = "ab" if downloaded_size else "wb"
with open(save_path, mode) as f:
    for chunk in response.iter_content(chunk_size=8192):
        f.write(chunk)

适用场景:

网络不稳定时恢复下载。
6. 下载需要认证的文件

python

import requests

url = "https://example.com/protected/file.zip"
save_path = "file.zip"
auth = ("username", "password")  # 或使用 API Key

response = requests.get(url, auth=auth)
with open(save_path, "wb") as f:
    f.write(response.content)

总结

方法 适用场景 优点
urllib.request 快速简单下载 无需安装第三方库
requests 通用下载(推荐) 功能全面,支持分块下载
tqdm + requests 大文件下载带进度条 直观显示进度
aiohttp 高性能异步下载 适合批量任务
断点续传 网络不稳定时恢复下载 避免重复下载
认证下载 需要登录/API 密钥的文件 支持 Basic Auth/OAuth
推荐选择:

大多数场景用 requests + tqdm(平衡易用性与功能)。
需要高性能时选 aiohttp。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!