Python中aiohttp的简单使用

 更新时间:2023年03月28日 09:26:54   作者:小Pawn爷  
aiohttp是Python中一个强大的异步HTTP客户端和服务器框架,它可以帮助开发者快速构建高性能的Web应用程序。本文将介绍aiohttp的基本概念、使用方法和常见应用场景,帮助读者更好地了解和使用这个优秀的框架

1.定义

aiohttp 是一个基于 asyncio 的异步 HTTP 网络模块,它既提供了服务端,又提供了客户端

2.基本使用

import aiohttp
import asyncio


async def fetch(session, url):
    # 声明一个支持异步的上下文管理器
    async with session.get(url) as response:
        # response.text()是coroutine对象 需要加await
        return await response.text(), response.status


async def main():
    # 声明一个支持异步的上下文管理器
    async with aiohttp.ClientSession() as session:
        html, status = await fetch(session, 'https://cuiqingcai.com')
        print(f'html: {html[:100]}...')
        print(f'status: {status}')


if __name__ == '__main__':
    #  Python 3.7 及以后,不需要显式声明事件循环,可以使用 asyncio.run(main())来代替最后的启动操作
    asyncio.get_event_loop().run_until_complete(main())

3.请求类型

session.post('http://httpbin.org/post', data=b'data')
session.put('http://httpbin.org/put', data=b'data')
session.delete('http://httpbin.org/delete')
session.head('http://httpbin.org/get')
session.options('http://httpbin.org/get')
session.patch('http://httpbin.org/patch', data=b'data')

4.相应字段

print('status:', response.status) # 状态码
print('headers:', response.headers)# 响应头
print('body:', await response.text())# 响应体
print('bytes:', await response.read())# 响应体二进制内容
print('json:', await response.json())# 响应体json数据

5.超时设置

import aiohttp
import asyncio
async def main():
   #设置 1 秒的超时 
   timeout = aiohttp.ClientTimeout(total=1)
   async with aiohttp.ClientSession(timeout=timeout) as session:
       async with session.get('https://httpbin.org/get') as response:
           print('status:', response.status)
if __name__ == '__main__':
   asyncio.get_event_loop().run_until_complete(main())

6.并发限制

import asyncio
import aiohttp
# 声明最大并发量为5
CONCURRENCY = 5
semaphore = asyncio.Semaphore(CONCURRENCY)
URL = 'https://www.baidu.com'

session = None
async def scrape_api():
   async with semaphore:
       print('scraping', URL)
       async with session.get(URL) as response:
           await asyncio.sleep(1)
           return await response.text()
    
async def main():
   global session
   session = aiohttp.ClientSession()
   scrape_index_tasks = [asyncio.ensure_future(scrape_api()) for _ in range(10000)]
   await asyncio.gather(*scrape_index_tasks)
if __name__ == '__main__':
   asyncio.get_event_loop().run_until_complete(main())

7.实际应用

import asyncio
import aiohttp
import logging
import json
logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://dynamic5.scrape.center/api/book/?limit=18&offset={offset}'
DETAIL_URL = 'https://dynamic5.scrape.center/api/book/{id}'
PAGE_SIZE = 18
PAGE_NUMBER = 100
CONCURRENCY = 5

semaphore = asyncio.Semaphore(CONCURRENCY)
session = None

async def scrape_api(url):
   async with semaphore:
       try:
           logging.info('scraping %s', url)
           async with session.get(url) as response:
               return await response.json()
       except aiohttp.ClientError:
           logging.error('error occurred while scraping %s', url, exc_info=True)

async def scrape_index(page):
   url = INDEX_URL.format(offset=PAGE_SIZE * (page - 1))
   return await scrape_api(url)

async def main():
   global session
   session = aiohttp.ClientSession()
   scrape_index_tasks = [asyncio.ensure_future(scrape_index(page)) for page in range(1, PAGE_NUMBER + 1)]
   results = await asyncio.gather(*scrape_index_tasks)
   logging.info('results %s', json.dumps(results, ensure_ascii=False, indent=2))
   

if __name__ == '__main__':
   asyncio.get_event_loop().run_until_complete(main())

到此这篇关于Python中aiohttp的简单使用的文章就介绍到这了,更多相关Python aiohttp 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用VLC实现自动播放视频的操作方法

    使用VLC实现自动播放视频的操作方法

    VLC是一款开源的多媒体播放器,它支持大量的视频和音频格式,并且具有强大的脚本和编程接口,这篇文章主要介绍了使用VLC实现自动播放视频,需要的朋友可以参考下
    2024-03-03
  • python上下文管理器使用场景及异常处理

    python上下文管理器使用场景及异常处理

    这篇文章主要为大家介绍了python上下文管理器使用场景及异常处理示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Python绘图之turtle库的基础语法使用

    Python绘图之turtle库的基础语法使用

    这篇文章主要给大家介绍了关于Python绘图之turtle库的基础语法使用的相关资料, Turtle库是Python语言中一个很流行的绘制图像的函数库,再绘图的时候经常需要用到的一个库需要的朋友可以参考下
    2021-06-06
  • Python切换pip源两种方法(解决pip install慢)

    Python切换pip源两种方法(解决pip install慢)

    这篇文章主要给大家介绍了关于Python切换pip源两种方法(解决pip install慢),我总结的这几种更换pip源的常用方式,希望可以帮助您成功配置国内源,解决安装Python包速度慢的问题,需要的朋友可以参考下
    2023-11-11
  • 深入浅析python3 依赖倒置原则(示例代码)

    深入浅析python3 依赖倒置原则(示例代码)

    今天通过园区停车信息这样一个场景分析python3 依赖倒置原则,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-07-07
  • Python3内置json模块编码解码方法详解

    Python3内置json模块编码解码方法详解

    Python3中我们利用内置模块json解码和编码JSON对象。json模块提供了四个功能:dumps、dump、loads、load本文详细讲解了Python3内置json模块的详细使用方法
    2021-10-10
  • 使用Python的Tornado框架实现一个Web端图书展示页面

    使用Python的Tornado框架实现一个Web端图书展示页面

    Tornado是Python的一款高人气Web开发框架,这里我们来展示使用Python的Tornado框架实现一个Web端图书展示页面的实例,通过该实例可以清楚地学习到Tornado的模板使用及整个Web程序的执行流程.
    2016-07-07
  • Pycharm+Python+PyQt5使用详解

    Pycharm+Python+PyQt5使用详解

    这篇文章主要介绍了Pycharm+Python+PyQt5使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • python删除列表中特定元素的几种方法

    python删除列表中特定元素的几种方法

    这篇文章主要介绍了python删除列表中特定元素的几种方法,文章围绕主题展开详细的内容介绍,具有一定的参考价价值,需要的小伙伴可以参考一下
    2022-05-05
  • 关于python中第三方库交叉编译的问题

    关于python中第三方库交叉编译的问题

    这篇文章主要介绍了python及第三方库交叉编译,通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序,需要的朋友可以参考下
    2022-09-09

最新评论