23. 异步HTTP请求与aiohttp模块

2023-10-30

目录

前言

aiohttp简介

aiohttp安装

aiohttp应用

先导包

拿到了批量URL

仿照上一节敲出模板

完善下载单个页面的代码

完整代码 

运行效果

总结


前言

上一节中,我们发现time.sleep()不是异步的,导致我们的异步函数无法按异步执行。实际上,requests模块的网络请求函数,get()、post()等也都不是异步的。所以我们想用它们做异步爬虫与网络请求时,就必须使用异步的HTTP请求,从而让异步函数正常工作。

那么在Python中如何实现异步HTTP请求呢?这就需要用到我们本节要介绍的新模块——aiohttp


aiohttp简介

asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine(协程)实现多用户的高并发支持。

asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。


aiohttp安装

pip install aiohttp

aiohttp应用

我们还是用一个例子来说明异步HTTP的使用方法吧。

加入我们有一组图片想要抓取,已经获得了这一堆图片的URL。

先导包

import asyncio
import aiohttp

要用到异步HTTP请求必然少不了异步I/O,因为网络请求本身就是一种I/O过程。

拿到了批量URL

urls = [
    "http://kr.shanghai-jiuxin.com/file/2021/0809/e9c2d265db15c768bd1fca0cb32cfc05.jpg",
    "http://kr.shanghai-jiuxin.com/file/2021/0809/f248df8386379735d855d1e56e9baae9.jpg",
    "http://kr.shanghai-jiuxin.com/file/2021/0809/ea079076530e5f3e85f1f1090428b6f9.jpg"
]

仿照上一节敲出模板

async def aiodownload(url):
    # TODO
    # 完成单个页面下载任务


async def main():

    # 准备异步协程对象列表
    tasks = []
    for url in urls:
        d = asyncio.create_task(download(url))
        tasks.append(d)
    
    # 一次性把所有任务都执行
    await asyncio.wait(tasks)

if __name__ == '__main__':
    asyncio.run(main())

完善下载单个页面的代码

async def aiodownload(url):
    # 发送请求
    # 得到图片内容
    # 保存到文件
    name = url.rsplit("/", 1)[1]  # 从右边切, 切一次. 得到[1]位置的内容
    async with aiohttp.ClientSession() as session:  # requests
        async with session.get(url) as resp:  # resp = requests.get()
            # 请求回来了. 写入文件
            # 可以自己去学习一个模块, aiofiles
            with open(f"./aiohttp_img/{name}", mode="wb") as f:  # 创建文件
                f.write(await resp.content.read())  # 读取内容是异步的. 需要await挂起, resp.text()

    print(name, "Complete!")
  • 先将URL最后的那一段作为图片名称,通过切片得到。
  • 再创建一个异步用户对话,它的用法相当于requests模块。
  • 异步请求数据,并写入文件,注意也要异步读取,用await挂起,否则异步失效。(也可以学习aiofiles来异步写入文件的方式)

完整代码 

# requests.get() 同步的代码 -> 异步操作aiohttp
# pip install aiohttp

import asyncio
import aiohttp

urls = [
    "http://kr.shanghai-jiuxin.com/file/2021/0809/e9c2d265db15c768bd1fca0cb32cfc05.jpg",
    "http://kr.shanghai-jiuxin.com/file/2021/0809/f248df8386379735d855d1e56e9baae9.jpg",
    "http://kr.shanghai-jiuxin.com/file/2021/0809/ea079076530e5f3e85f1f1090428b6f9.jpg"
]


async def aiodownload(url):
    # 发送请求
    # 得到图片内容
    # 保存到文件
    name = url.rsplit("/", 1)[1]  # 从右边切, 切一次. 得到[1]位置的内容
    async with aiohttp.ClientSession() as session:  # requests
        async with session.get(url) as resp:  # resp = requests.get()
            # 请求回来了. 写入文件
            # 可以自己去学习一个模块, aiofiles
            with open(f"./aiohttp_img/{name}", mode="wb") as f:  # 创建文件
                f.write(await resp.content.read())  # 读取内容是异步的. 需要await挂起, resp.text()

    print(name, "Complete!")


async def main():
    tasks = []
    for url in urls:
        tasks.append(aiodownload(url))

    await asyncio.wait(tasks)


if __name__ == '__main__':
    asyncio.run(main())

运行效果


总结

本节我们介绍了异步HTTP请求的方法——借助aiohttp库实现。通过一个简单的实例实践了异步HTTP请求,效率也是极高的,不到一眨眼的功夫,三条URL的内容已经全部保存到本地了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

23. 异步HTTP请求与aiohttp模块 的相关文章

随机推荐

  • Golang sync.pool对象池

    概览 Goalng中通过sync pool提供了对象池的实现来达到对象复用的目的 在netty中 也通过Recycle类实现了类似的对象池实现 在netty的对象池Recycle中 当A线程需要将B线程申请的对象回收到对象池中的时候 会专门
  • handleMessage的使用

    xml代码
  • YOLOv5学习笔记

    转载于 深入浅出Yolo系列之Yolov5核心基础知识完整讲解 江南研习社 CSDN博客 yolov5 1 网络结构 Yolov5官方代码中 给出的目标检测网络中一共有4个版本 分别是Yolov5s Yolov5m Yolov5l Yolo
  • 贪心算法:最优分解问题

    问题描述 设n是一个正整数 现要求将n分解为若干个互不相同的自然数的和 使这些自然数的乘积最大 代码如下 int BestMul int n int i j mul 1 int num 初始化一个数组 用来存放分解后的每个数 int a M
  • 基于Feign的局部请求拦截

    由于项目的要求 不能对所有基于Feign的进行拦截 需要对不同的Feign请求进行不同的拦截 经过资料的收集整理以及SpringCloud中对于Feign的集成的源码的阅读 解决了针对Feign请求的局部拦截 本项目中SpringCloud
  • Git(10)——Git多人协同开发之邀请成员

    一 简介 本篇文章接着第九章介绍Git多人协同开发如何邀请成员 二 创建dev分支 前面已经提到master只用于上线正式代码 因此需要创建一个专门用于开发的dev分支 使用如下命令创建dev分支并切换到dev分支 git checkout
  • 闲鱼项目月入三万,赶紧来蹭这波红利!

    如果你弄懂了信息差 你就会知道什么叫商业 也许你会说 别扯了 现在互联网这么发达 信息差肯定越来越少 我只能说你太天真 信息差存在于你生活的每个角落 尤其是在人们的地域文化差异 教育水平层次和认知中 而这其间也存在着巨大的商机 举个栗子 比
  • mac安装conda后,终端的用户名前面有一个(base),最佳解决方案

    本文转载自https blog csdn net u010666669 article details 90085125 mac安装了conda后 前面会有一个 base 很烦人 终于找到最佳解决方案了 conda config set a
  • 刷脸支付永远不会过时只会不断的变革

    物联网大爆炸时代 AI 人工智能 人脸识别等名词像一个永不过时的网红时常出现在我们面前 从研发到发展 然后落地应用 刷脸支付逐步走进我们的衣食住行中 并在很多行业发挥着其高效便捷的作用 刷脸支付是对传统支付方式的革命 也是移动支付新的利润增
  • Linux下的网络服务之网关、DNS、网桥

    一 网关 1 1 基本概念 网关 路由器上和客户主机处在同一网段的IP称为客户机的网关 1 2 网关的设定 方式 命令 含义 临时 ip route add default via 172 25 254 100 添加网关 ip route
  • 找不到com.google.common.base.Predicates

    原因在于 swagger2解决冲突时 排除了了guava 在dependecies management进行版本限制
  • Windows丢失缺少api-ms-win-crt-process-l1-1-0.dll解决方法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个api ms win crt process l
  • html canvas画背景图片,使用canvas画图并充当背景图片,但出现奇怪效果_html/css_WEB-ITnose...

    这是初始的样子 我想要的效果是这颗心不随滚动条滚动 当我拖动滚动条的时候 这颗心跟着移动了 但原位置固定了另一颗心 继续拖动滚动条 由此可见 初始页面的心会随着滚动条移动 但同时有另一个心被固定在中间 我只想要让这个心被固定在中心 不会因为
  • figma的一些用法(一)

    1 新建frame画布 2 圆角按钮 3 放大字体并设置效果
  • 普通域用户远程桌面登录域控制器

    想个一个普通用户登录域控制器进行添加用户等操作 将此用户设置到运行远程桌面登录 但是登录的时候提示 要登录到这台远程计算机 您必须被授予允许通过终端登录权限 默认情况下 管理员 组的成员拥有该权限 在域控上单独设置远程桌面登录没有用 还需要
  • JSP+Servlet+JavaBean 开发案例——求和运算

    问题 利用 JSP Servlet JavaBean 编程 实现任意两个整数的累加值 并显示结果 分析 该题目采用JSP Servlet JavaBean模式 按其不同的职责 由JavaBean封装业务逻辑处理计算累加值 由JSP实现信息的
  • C#中的??、?:和?

    可空类型修饰符 引用类型可以使用空引用表示一个不存在的值 而值类型通常不能表示为空 例如 string str null 是正确的 int i null 编译器就会报错 为了使值类型也可为空 就可以使用可空类型 即用可空类型修饰符 来表示
  • nginx的基本配置

    1 静态HTTP服务器 首先 Nginx是一个HTTP服务器 可以将服务器上的静态文件 如HTML 图片 通过HTTP协议展现给客户端 2 反向代理服务器 什么是反向代理 客户端本来可以直接通过HTTP协议访问某网站应用服务器 如果网站管理
  • 中国天气网接口类(中国天气预报)

    新写的中国天气网api接口类 分享给大家 妈妈再也不用担心我出门被天气君欺负了 只需修改两个参数 private key appid 即可使用 这两个参数从中国天气网获取 地址是 http openweather weather com c
  • 23. 异步HTTP请求与aiohttp模块

    目录 前言 aiohttp简介 aiohttp安装 aiohttp应用 先导包 拿到了批量URL 仿照上一节敲出模板 完善下载单个页面的代码 完整代码 运行效果 总结 前言 在上一节中 我们发现time sleep 不是异步的 导致我们的异