Python 下载的 11 种姿势,一种比一种高级!

简介: Python 下载的 11 种姿势,一种比一种高级!

在数据驱动的时代,掌握高效获取网络资源的技能至关重要。


Python,作为一门简洁而强大的语言,为我们提供了丰富的工具来下载文件,无论是简单的图片、网页,还是存储在云端的资源。


本文将带你深入浅出地学习如何使用 Python 下载文件,从基础模块到高级技巧,助你轻松应对各种下载场景。


1. Requests:简洁优雅的下载利器

requests 模块以其简洁易用的 API 成为 Python 下载文件的首选。只需几行代码,即可轻松下载文件。

import requests
 
url = 'https://www.example.com/myfile.zip'  # 文件 URL
response = requests.get(url)  # 发送 GET 请求
 
with open('myfile.zip', 'wb') as f:  # 打开文件以二进制写入模式
    f.write(response.content)  # 将响应内容写入文件

2. Wget:经典下载工具的 Python 封装

wget 是一个经典的命令行下载工具,Python 的 wget 模块对其进行了封装,提供了便捷的下载功能。

import wget
 
url = 'https://www.python.org/static/community_logos/python-logo-master-v3-TM.png'  # 文件 URL
wget.download(url, 'python-logo.png')  # 下载文件并指定保存路径

3. 挑战:下载重定向的文件

有些情况下,我们需要下载的文件 URL 会发生重定向。requests  模块可以轻松应对这种情况。

import requests
 
url = 'https://www.example.com/redirect'  # 重定向 URL
response = requests.get(url, allow_redirects=True)  # 允许重定向
 
with open('myfile.pdf', 'wb') as f:
    f.write(response.content)

通过将 allow_redirects 参数设置为 True,requests 会自动处理重定向,获取最终的文件内容。

4. 分块下载:应对大型文件

下载大型文件时,为了避免内存溢出,我们可以使用分块下载的方式。

import requests
 
url = 'https://www.example.com/largefile.pdf'
response = requests.get(url, stream=True)  # 以流式方式获取响应
 
with open('largefile.pdf', 'wb') as f:
    for chunk in response.iter_content(chunk_size=1024):  # 每次读取 1024 字节
        if chunk:
            f.write(chunk)

5. 并行下载:提升下载效率

当需要下载多个文件时,我们可以使用多线程或多进程来并行下载,提高效率。

import os
import time
from concurrent.futures import ThreadPoolExecutor
 
import requests
 
urls = [  # 文件 URL 列表
    ('file1.txt', 'https://www.example.com/file1.txt'),
    ('file2.jpg', 'https://www.example.com/file2.jpg'),
    ('file3.zip', 'https://www.example.com/file3.zip'),
]
 
 
def download_file(url, path):
    response = requests.get(url)
    with open(path, 'wb') as f:
        f.write(response.content)
 
 
start_time = time.time()
 
with ThreadPoolExecutor(max_workers=3) as executor:  # 创建线程池
    for url in urls:
        executor.submit(download_file, url[1], url[0])  # 提交下载任务
 
end_time = time.time()
 
print(f"下载完成,耗时:{end_time - start_time:.2f} 秒")

6. 下载进度条:实时追踪下载进度

使用 clint 模块,我们可以为下载过程添加进度条,实时追踪下载进度。

import requests
from clint.textui import progress
 
url = 'https://www.example.com/largefile.zip'
response = requests.get(url, stream=True)
 
total_length = int(response.headers.get('content-length'))
 
with open('largefile.zip', 'wb') as f:
    for chunk in progress.bar(response.iter_content(chunk_size=1024), expected_size=(total_length / 1024) + 1):
        if chunk:
            f.write(chunk)

7. Urllib:Python 内置的网络请求库

urllib 是 Python 内置的网络请求库,无需安装即可使用。

import urllib.request
 
url = 'https://www.example.com'
urllib.request.urlretrieve(url, 'index.html')  # 下载网页并保存为 index.html

8. 代理下载:保护隐私,突破限制

在某些情况下,我们需要使用代理服务器下载文件,例如保护隐私、突破网络限制等。

import urllib.request
 
proxy_handler = urllib.request.ProxyHandler({'http': 'http://your_proxy:port'})  # 设置代理
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
 
url = 'https://www.example.com/file.zip'
urllib.request.urlretrieve(url, 'file.zip')

9. Urllib3:功能强大的网络请求库

urllib3 是 urllib 的升级版本,提供了更多功能,例如连接池、SSL 验证等。

import urllib3
import shutil
 
url = 'https://www.example.com'
 
http = urllib3.PoolManager()
response = http.request('GET', url)
 
with open('index.html', 'wb') as f:
    shutil.copyfileobj(response.data, f)

10. Boto3:下载 Amazon S3 文件

boto3 是 AWS 官方提供的 Python SDK,可以方便地操作 Amazon S3 等服务。

import boto3
 
bucket_name = 'your-bucket-name'  # 存储桶名称
file_name = 'your-file.txt'  # 文件名
download_path = 'downloaded_file.txt'  # 下载路径
 
s3 = boto3.client('s3')
s3.download_file(bucket_name, file_name, download_path)


11. Asyncio:异步下载,提升效率

asyncio 是 Python 3.4 版本引入的异步 IO 库,可以实现高效的异步下载。

import asyncio
import aiohttp
 
async def download_file(session, url):
    async with session.get(url) as response:
        content = await response.read()
        return content
 
async def main():
    urls = [
        'https://www.example.com/file1.txt',
        'https://www.example.com/file2.jpg',
        'https://www.example.com/file3.zip',
    ]
 
    async with aiohttp.ClientSession() as session:
        tasks = [download_file(session, url) for url in urls]
        results = await asyncio.gather(*tasks)
 
        for i, result in enumerate(results):
            with open(f'file{i+1}', 'wb') as f:
                f.write(result)
 
if __name__ == '__main__':
    asyncio.run(main())

总结

本文介绍了使用 Python 下载文件的各种方法,从基础模块到高级技巧,涵盖了大部分下载场景。希望本文能够帮助你更加高效地获取网络资源,在数据科学的道路上披荆斩棘!

相关文章
|
3月前
|
Python
Python使用ffmpeg下载m3u8拼接为视频
Python使用ffmpeg下载m3u8拼接为视频
142 1
|
8天前
|
存储 缓存 安全
Python案例分享:如何实现文件的上传下载
Python案例分享:如何实现文件的上传下载
37 6
|
21天前
|
JSON JavaScript API
用Python编写小工具下载OSM路网数据
用Python编写小工具下载OSM路网数据
|
20天前
|
前端开发 数据库 Python
用Python轻松开发数据库取数下载工具
用Python轻松开发数据库取数下载工具
|
1月前
|
Python
Python 下载 html 中的 图片
Python 下载 html 中的 图片
21 2
|
24天前
|
API 网络安全 开发工具
【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)
【Azure Developer - 密钥保管库 】使用 Python Azure SDK 实现从 Azure Key Vault Certificate 中下载证书(PEM文件)
|
27天前
|
数据处理 Python
解锁Python多线程编程魔法,告别漫长等待!让数据下载如飞,感受科技带来的速度与激情!
【8月更文挑战第22天】Python以简洁的语法和强大的库支持在多个领域大放异彩。尽管存在全局解释器锁(GIL),Python仍提供多线程支持,尤其适用于I/O密集型任务。通过一个多线程下载数据的例子,展示了如何使用`threading`模块创建多线程程序,并与单线程版本进行了性能对比。实验表明,多线程能显著减少总等待时间,但在CPU密集型任务上GIL可能会限制其性能提升。此案例帮助理解Python多线程的优势及其适用场景。
26 0
|
2月前
|
C++ Python
《从零开始学Python》(第二版) PDF下载读书分享
Python,由Guido van Rossum创造(1989),是1991年发布的面向对象、解释型编程语言,以其简洁清晰的语法和强大的库著称,昵称“胶水语言”。它连接不同模块,强调代码的优雅、明确和简单。《从零开始学Python》(第二版)是本风趣、实践导向的教材,提供PDF下载,是学习Python的宝贵资源。![书封](https://ucc.alicdn.com/pic/developer-ecology/nrw3f3oqlpmag_40f357729aac4defa97fb1e0f66a2501.png)
44 1
《从零开始学Python》(第二版) PDF下载读书分享
|
1月前
|
编译器 Linux TensorFlow
【Deepin 20系统】Tensorflow2.x离线下载cifar-10-python.tar.gz如何配置使用cifar10.load_data()
文章讨论了在Deepin 20系统上使用Tensorflow 2.x时,如何通过离线方式配置使用CIFAR-10数据集。
34 0
|
2月前
|
Python
接上python如何处理下载中断的情况
实现断点续传机制涉及记录已下载的字节数、使用`Range`头继续下载及合并文件块。Python示例代码展示了如何通过`requests`库从上次中断的位置开始下载,将新内容追加到现有文件。函数`resume_download(url, filename, last_byte=0)`接收URL、文件名和最后字节位置作为参数。注意,实际使用时需确保URL和文件路径有效。
107 0