百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

aiohttp:一个非常实用的异步请求python库

liuian 2025-02-11 12:40 13 浏览

前言

aiohttp 是一个用于异步HTTP请求的Python框架和库,它建立在 asyncio 之上,提供了易于使用的API来处理HTTP请求和响应。aiohttp 支持客户端和服务器端操作,适用于构建高性能的网络应用程序。

一.安装

pip install aiohttp


二.基本用法

1.异步请求client发送http请求

import aiohttp
import asyncio


async def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as response:
            return response


async def main():
    url = 'https://baidu.com'
    response = await fetch(url)
    print(response.status)


asyncio.run(main())
# 输入请求状态码
# 200

2.异步server服务端

from aiohttp import web


async def handle(request):
    return web.Response(text="Hello, aiohttp!")


app = web.Application()
app.router.add_get('/', handle)


web.run_app(app)

浏览器访问127.0.0.1:8080 返回结果如下


3.常用函数

  1. ClientSession: 这是发起HTTP请求的核心类,用于创建会话,通过会话可以发送GET、POST等请求,并保持连接和cookies。
  2. request: 除了使用 ClientSessionaiohttp 还提供了 request 函数,可以直接发送HTTP请求而不需要创建一个会话对象。
  3. web.Application: 用于创建异步Web服务器的主要类,可以通过添加路由和处理函数来定义服务器的行为。
  4. web.Response: 这个类用于构造HTTP响应,你可以设置状态码、头部信息和响应体。
  5. web.Request: 表示一个HTTP请求,包含请求的方法、URL、头部等信息。
  6. web.Router: 用于管理路由的对象,可以添加新的路由规则和对应的处理函数。
  7. web.run_app: 这个函数用于启动一个 web.Application 实例,它会运行服务器并开始监听端口。
  8. websocket: aiohttp 支持WebSocket协议,提供了相关的API来创建和管理WebSocket连接。
  9. ClientConnector: 用于控制与服务器的TCP连接,可以自定义连接池的行为。
  10. ClientSession.get, ClientSession.post 等:这些是 ClientSession 类中的方法,用于执行具体的HTTP请求动作,如GET或POST。


4.异常实践

异步爬取百度读书免费小说

import requests
import asyncio
import aiohttp
import aiofiles
import json




# 异步访问小说内容,并且异步保存到文件
async def aiodownload(cid, b_id, title):
    data = {
        "book_id":b_id,
        "cid":f"{b_id}|{cid}",
        "need_bookinfo":1
    }
    data = json.dumps(data)
    url = f"http://dushu.baidu.com/api/pc/getChapterContent?data={data}" # 拿到小说的内容


    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            dic = await resp.json()


            async with aiofiles.open("小说/"+title+".txt", mode="w", encoding="utf-8") as f:
                await f.write(dic['data']['novel']['content'])  # 把小说内容保存到文件




async def getCatalog(url):
    resp = requests.get(url) # 请求获取小说的所有章节名称
    dic = resp.json()
    tasks = []
    for item in dic['data']['novel']['items']:  # item就是对应每一个章节的名称和cid
        title = item['title']
        cid = item['cid']
        # 准备异步任务
        tasks.append(aiodownload(cid, b_id, title))
    await asyncio.wait(tasks)




if __name__ == '__main__':
    b_id = "4305593636"
    url = 'http://dushu.baidu.com/api/pc/getCatalog?data={"book_id":"' + b_id + '"}'
    asyncio.run(getCatalog(url))

结果如下:

三.注意事项

1.理解异步编程的概念是使用aiohttp的前提。异步编程涉及到协程、事件循环和异步上下文管理器等概念,因此熟悉Python的async/await语法是必要的。

2.异常处理是保证程序稳定性的关键。在使用aiohttp时,应当妥善处理可能发生的异常和错误,例如网络请求失败、超时等情况。

3.合理管理客户端会话也很重要。官方推荐使用一个客户端会话来发起所有请求,这样可以保持请求的cookie等信息。同时,aiohttp.ClientSession是一个异步上下文管理器,它可以在请求结束或发生异常时自动关闭会话,从而避免资源泄露。

4.利用asyncio提供的工具和函数可以提高效率。例如,asyncio.gather()可以同时运行多个协程,这样可以更好地利用事件循环,提高程序的并发性能。

5.了解aiohttp与其他库的区别也很有帮助。例如,与传统的同步HTTP库如requests相比,aiohttp是基于异步IO的,可以实现单线程并发IO操作,这对于编写高性能的网络应用程序尤为重要。


更多用法参考官方文档

https://docs.aiohttp.org/en/stable/client_quickstart.html

github地址

https://github.com/aio-libs/aiohttp

相关推荐

GCI: Another key public good for international community

MembersofadelegationofhighschoolstudentsfromtheU.S.stateofWashingtonposeforaphotoa...

kube on kube 实现思路分享(kube-scheduler)

这里的kubeonkube,是指建立K8s元集群,纳管其他业务K8s集群,通过声明式API管理集群的创建、增删节点等。参考https://github.com/kubean-i...

China and India hold the key to a more inclusive global future

ByMayaMajueranLead:AsChinaandIndiamark75yearsofdiplomaticties,theircooperationcouldse...

日本真子公主的婚礼又要提上日程了吗?未婚夫:债务问题已解决

日本明仁天皇将于今年3月31日退位,德仁皇太子即将成为新一任的天皇。在平成时代最后的倒计时中,明仁天皇的孙女真子公主的婚事却又一次进入了人们的视野。(viaTheTelegraph)关注日本皇室的...

kratos源码分析系列(1)(kvm源码解析与应用 pdf)

https://github.com/go-kratos/kratos是b站开源的一个微服务框架,整体来看它结合grpc生态中的grpc-gateway,以及wire依赖注入和众多常用的trace,m...

【2.C#基础】6.循环语句(c#循环语句例子)

6.循环语句当需要多次执行同一个处理时,就需要用到循环语句。一般情况下,循环的流程图如下:6.1while循环C#中的while循环语句在给定的条件为真的情况下会重复执行目标语句。格式如下:...

使用 Google Wire 在 Go 中进行依赖注入

关注点分离、松耦合系统和依赖反转原则等概念在软件工程中是众所周知的,并且在创建良好的计算机程序过程中至关重要。在本文中,我们将讨论一个同时应用了这三个原则的技术,称为依赖注入。我们将尽可能地实践,更加...

用 Golang封装你的API(golang封装dll)
用 Golang封装你的API(golang封装dll)

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。@头条创作挑战赛本文探讨了在用Golang封装你的API的过程以及几个不同的编程步骤。我做了一个非常有限的时间来证明如何为客户正在开...

2025-05-09 20:03 liuian

Terraform 实战 | 万字长文(terrify是什么意思中文)

Terraform是什么Terraform(https://www.terraform.io/)是HashiCorp旗下的一款开源(Go语言开发)的DevOps基础架构资源管理运维工具,可...

Go 语言入门:环境安装(go语言安装 window)

一、前言这里不同于其他人的Go语言入门,环境安装我向来注重配置,比如依赖包、缓存的默认目录。因为前期不弄好,后面要整理又影响这影响那的,所以就干脆写成文章,方便后期捡起。二、安装1.安装包htt...

Go语言进阶之Go语言高性能Web框架Iris项目实战-项目结构优化EP05

前文再续,上一回我们完成了用户管理模块的CURD(增删改查)功能,功能层面,无甚大观,但有一个结构性的缺陷显而易见,那就是项目结构过度耦合,项目的耦合性(Coupling),也叫耦合度,进而言之,模块...

如何将Go项目与Docker结合实现高效部署

在现代软件开发中,使用Docker部署应用程序已经成为一种标准实践。本文将深入探讨如何将Go项目与Docker结合,实现高效、可靠的部署过程。通过详细的步骤和丰富的示例,你将能够迅速掌握这一流程。准备...

五分钟轻松熟悉一个k8s Operator应用制作

简介:operator是一种kubernetes的扩展形式,可以帮助用户以Kubernetes的声明式API风格自定义来管理应用及服务,operator已经成为分布式应用在k8s集群部...

程序员的副业秘籍!一款可以快速搭建各类系统的后台管理系统

系统简介这是一个基于Gin+Vue+ElementUI(或ArcoDesign、AntDesign)的系统快速开发平台,采用了前后端分离,旨在帮助用户快速完成各类系统的基础功能搭建。平...

使用 Go 语言开发区块链钱包的项目目录结构设计

在开发区块链钱包时,项目的目录结构应该清晰、模块化,确保代码的可维护性和扩展性。基于Go的惯例,结合区块链钱包的功能需求,以下是一个较为合理的目录结构示例:1.目录结构blockchain-wa...