Python 利用aiohttp异步流式下载文件

背景

本篇文章为小编翻译文章,小编在查找资料时看到的一篇文章,看了后感觉不错,就翻译过来,供大家参考学习

文章原文地址:https://www.slingacademy.com/article/python-aiohttp-how-to-download-files-using-streams/

Overview 概述

aiohttp 是一个现代库,为Python提供异步(协程)HTTP客户端和服务器功能。流是一种分块处理数据的方式,无需一次将整个文件加载到内存中,这对于下载大文件或同时处理多个请求非常有用。

可以通过以下步骤下载带有aiohttp流的文件(尤其是几百MB或更多的大文件):

  1. 创建一个 aiohttp.ClientSession 对象,它表示用于发出HTTP请求的连接池(客户端会话,用于发送不同的HTTP请求)

  2. 使用 session.get 方法向文件URL发送get请求,并获得aiohttp.ClientResponse 对象,表示来自服务器的响应

  3. 使用 response.content 属性访问 aiohttp.StreamReader 对象,它是用于读取响应主体的流

  4. 使用 stream.readstream.redany 方法从流中读取数据块,并将其写入本地的文件中

  5. 完成后关闭响应和会话对象(这可以通过使用 async with 语句自动完成)

上面说的这么多,可能让你困惑且难以理解,让我们来看看下面的例子以获得更清晰的理解

Complete Example 完整示例

假如我们要同时下载两个文件,一个文件是CSV,另一个是PDF
CSV文件的URL:
https://api.slingacademy.com/v1/sample-data/files/student-scores.csv

PDF文件的URL:
https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf

完整的代码(带说明)
在运行以下代码时,aiohttp 建议更新为最新的版本,否则可能报错

# SlingAcademy.com
# This code uses Python 3.11.4

import asyncio
import aiohttp

# This function downloads a file from a URL and saves it to a local file
# The function is asynchronous and can handle large files because it uses aiohttp streams
async def download_file(url, filename):
    async with aiohttp.ClientSession() as session:
        print(f"Starting download file from {url}")
        async with session.get(url) as response:
            assert response.status == 200
            with open(filename, "wb") as f:
                while True:
                    chunk = await response.content.readany()
                    if not chunk:
                        break
                    f.write(chunk)
            print(f"Downloaded {filename} from {url}")


# This function downloads two files at the same time
# 同时下载两个文件
async def main():
    await asyncio.gather(
        # download a CSV file
        download_file(
            "https://api.slingacademy.com/v1/sample-data/files/student-scores.csv",
            "test.csv",
        ),

        # download a PDF file
        download_file(
            "https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf",
            "test.pdf",
        ),
    )

# Run the main function
asyncio.run(main())

运行的输出:

Starting download file from https://api.slingacademy.com/v1/sample-data/files/student-scores.csv
Starting download file from https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf
Downloaded test.pdf from https://api.slingacademy.com/v1/sample-data/files/text-and-table.pdf
Downloaded test.csv from https://api.slingacademy.com/v1/sample-data/files/student-scores.csv

下载的文件将保存在当前的脚本目录中,test.csvtest.pdf,如下面的屏幕截图所示:
下载的文件位置

历史相关文章

  • Python 利用协程采集想看的《人世间》下载地址

以上是自己实践中遇到的一些问题,分享出来供大家参考学习,欢迎关注微信公众号:DataShare ,不定期分享干货

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/205188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

6、Qt延时的使用

一、sleep() 1、说明 QThread类中如下三个静态函数: QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单,但是会阻塞线程,有界面时界面会卡死,一般在非GUI线…

Linux常用命令——cd命令

文章目录 1. 简介2. 命令参数3. 常见用法与实例3.1 基本用法3.2 使用绝对路径或相对路径3.3 使用特殊字符3.4 使用参数 4. 总结 1. 简介 cd命令是Linux系统中最基础且频繁使用的命令之一,用于改变当前工作目录。它是“change directory”的缩写,对于任何…

mybatis快速入门(基于Mapper接口编程)

1、准备数据模型,建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSERT INTO t_emp(emp_name,emp_salary) VALUES("tom&qu…

北美运营商T-mobile认证分级简介和定义类型

T-mobile认证如果对于成品来说,有个好处就是可以选用经过T-mobile认证过的模组或者芯片,如果产品使用的芯片或者模组是没有经过认证的,测试量和测试时间方面会比使用认证过的多一些。此外T-mobile认证对产品的认证进行分级管理:认…

Netty Review - 探索Pipeline的Inbound和Outbound

文章目录 概念Server CodeClient CodeInboundHandler和OutboundHandler的执行顺序在InboundHandler中不触发fire方法InboundHandler和OutboundHandler的执行顺序如果把OutboundHandler放在InboundHandler的后面,OutboundHandler会执行吗 概念 我们知道当boss线程监控…

Linux常用命令----mkdir命令

文章目录 1. 基础概念2. 参数含义3. 常见用法4. 实例演示5. 结论 在Linux操作系统中,mkdir 命令是用来创建目录的基础命令。这个命令简单但极其强大,是每个Linux用户都应当熟悉的工具之一。以下是对mkdir命令的详细介绍,包括其参数含义、常见…

【C++】: unordered_map的使用

1、概念 key 键值的类型。unordered_map中的每个元素都是由其键值唯一标识的。 T 映射值的类型。unordered_map中的每个元素都用来存储一些数据作为其映射值。 Hash 一种一元函数对象类型,它接受一个key类型的对象作为参数,并根据该对象返回size_t类型…

jenkins-cicd基础操作

1.先决条件 1.首先我个人势在k8s集群中创建的jenkins,部署方法搭建 k8s部署jenkins-CSDN博客 2.安装指定插件. 1.Gitlab plugin 用于调用gitlab-api的插件 2.Kubernetes plugin jenkins与k8s进行交互的插件,可以用来自动化的构建和部署 3.Build Authorizatio…

【MATLAB】异常数据识别

基于分位数的异常点识别 首先,给定了一个原始数据序列x。然后,计算了序列x的上四分位数和下四分位数,并根据这两个值计算了异常点的阈值。上四分位数减去1.5倍的四分位数范围得到异常值下界,下四分位数加上1.5倍的四分位数范围得…

进程--特征、五种基本状态、PCB、进程的创建与终止

一、进程的定义与特征 为了使参与并发执行的每个程序都能独立地允许,在操作系统中为程序配置一个专门的数据结构,称为进程控制块(Process Control Block,PCB)。系统利用PCB来描述进程的基本情况和活动过程&#xff0c…

每日一练 | 华为认证真题练习Day140

1、如图所示,网络管理员希望将SWA与SWB之间的两条物理链路手工聚合成一条Eth-trunk链路;下列描述正确的是()。 A. 不能被聚合 B. 聚合后可以正常工作 C. 可以聚合,聚合后只有GE端口能收发数据 D. 可以聚合&#xff…

【C++】程序题( STL标准模板库)

🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL&#xff1a…

如何去选择合适的线缆测试仪?CAT8网线认证测试

如何去选择合适的线缆测试仪? 如果你是第三方检测单位,系统集成商,或者线缆生产厂家,我个人建议选择福禄克DSX系列无疑是比较保险的做法,因为考虑到福禄克在国内耕耘多年所积累起来的品牌知名度和口碑,选择一款大家都…

[VNCTF 2023] web刷题记录

文章目录 象棋王子电子木鱼BabyGo 象棋王子 考点:前端js代码审计 直接查看js源码,搜一下alert 丢到控制台即可 电子木鱼 考点:整数溢出 main.rs我们分段分析 首先这段代码是一个基于Rust的web应用程序中的路由处理函数。它使用了Rust的异步…

Achronix推出基于FPGA的加速自动语音识别解决方案

提供超低延迟和极低错误率(WER)的实时流式语音转文本解决方案,可同时运行超过1000个并发语音流 2023年11月——高性能FPGA芯片和嵌入式FPGA(eFPGA IP)领域的领先企业Achronix半导体公司日前自豪地宣布:正式…

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。很多人可能想不明白,这里的映射到底是啥意思,为啥访问的时间…

【Linux】firewall防火墙配置-解决Zookeeper未授权访问漏洞

背景: zookeeper未授权访问漏洞,进行限制访问,采用防火墙访问策略 配置步骤: ##查看firewall配置清单 firewall-cmd --list-all ##查到为关闭态,启动防火墙 systemctl start firewalld ## 添加端口,这里…

lv11 嵌入式开发 轮询与中断13

1 CPU与硬件的交互方式 轮询 CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始 中断 CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中…

训练自己的个性化Stable diffusion模型,LORA

一、背景 需要训练自己的LORA模型 二、分析 1、有sd-webui有训练插件功能 2、有单独的LORA训练开源web界面 两个开源训练界面 1、秋叶写的SD-Trainer https://github.com/Akegarasu/lora-scripts/ 没成功,主要也是cudnn和nvidia-smi中的CUDA版本不一致退出 2…

window10家庭版中文转专业版流程

1.确认当前为家庭中文版 2.用管理员权限打开cmd窗口 3.输入 dism /online /get-targeteditions ,查询当前支持的升级的版本 4.专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T 5.changepk.exe /productkey VK7JG-NPHTM-C97JM-9MPGT-3V66T