python---aiohttp的使用详细剖析

简介: python---aiohttp的使用详细剖析

1.aiohttp的简单使用(配合asyncio模块)
复制代码
import asyncio,aiohttp

async def fetch_async(url):
print(url)
async with aiohttp.request("GET",url) as r:
reponse = await r.text(encoding="utf-8")  #或者直接await r.read()不编码,直接读取,适合于图像等无法编码文件
print(reponse)

tasks = [fetch_async('http://www.baidu.com/'), fetch_async('http://www.chouti.com/')]

event_loop = asyncio.get_event_loop()
results = event_loop.run_until_complete(asyncio.gather(*tasks))
event_loop.close()
复制代码
2.发起一个session请求
复制代码
import asyncio,aiohttp

async def fetch_async(url):
print(url)
async with aiohttp.ClientSession() as session:  #协程嵌套,只需要处理最外层协程即可fetch_async

//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjY0Mjc5Mg==.html
async with session.get(url) as resp:
print(resp.status)
print(await resp.text())  #因为这里使用到了await关键字,实现异步,所有他上面的函数体需要声明为异步async

tasks = [fetch_async('http://www.baidu.com/'), fetch_async('http://www.cnblogs.com/ssyfj/')]

event_loop = asyncio.get_event_loop()
results = event_loop.run_until_complete(asyncio.gather(*tasks))
event_loop.close()
复制代码
除了上面的get方法外,会话还支持post,put,delete....等
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')
不要为每次的连接都创建一次session,一般情况下只需要创建一个session,然后使用这个session执行所有的请求。

每个session对象,内部包含了一个连接池,并且将会保持连接和连接复用(默认开启)可以加快整体的性能。

3.在url中传递参数(其实与requests模块使用大致相同)
只需要将参数字典,传入params参数中即可
复制代码
import asyncio,aiohttp

async def func1(url,params):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
print(r.url)
print(await r.read())

tasks = [func1('https://www.ckook.com/forum.php',{"gid":6}),]

event_loop = asyncio.get_event_loop()
results = event_loop.run_until_complete(asyncio.gather(*tasks))
event_loop.close()
复制代码
4.获取响应内容(由于获取响应内容是一个阻塞耗时过程,所以我们使用await实现协程切换)
(1)使用text()方法
复制代码
async def func1(url,params):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
print(r.url)
print(r.charset)  #查看默认编码为utf-8
print(await r.text())  
//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjc4ODQxMg==.html

不编码,则是使用默认编码  使用encoding指定编码
复制代码
(2)使用read()方法,不进行编码,为字节形式
async def func1(url,params):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
print(r.url)
print(await r.read())
(3)注意:text(),read()方法是把整个响应体读入内存,如果你是获取大量的数据,请考虑使用”字节流“(StreamResponse)
5.特殊响应内容json(和上面一样)
复制代码
async def func1(url,params):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
print(r.url)
print(r.charset)
print(await r.json())  #可以设置编码,设置处理函数
复制代码
6.字节流形式获取数据(不像text,read一次获取所有数据)
注意:我们获取的session.get()是Response对象,他继承于StreamResponse
async def func1(url,params):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
print(await r.content.read(10)) #读取前10字节
下面字节流形式读取数据,保存文件
复制代码
async def func1(url,params,filename):
async with aiohttp.ClientSession() as session:
async with session.get(url,params=params) as r:
with open(filename,"wb") as fp:
while True:
chunk = await r.content.read(10)
if not chunk:
break
fp.write(chunk)

tasks = [func1('https://www.ckook.com/forum.php',{"gid":6},"1.html"),]

相关文章
|
4月前
|
Python
Python Requests 基本使用(与 urllib 的区别)
Python Requests 基本使用(与 urllib 的区别)
74 0
|
3天前
|
测试技术 API Python
Python中requests、aiohttp、httpx性能对比
这篇文章对比了Python中三个流行的HTTP客户端库:requests、aiohttp和httpx,在发送HTTP请求时的性能,并提供了测试代码和结果,以帮助选择适合不同应用场景的库。
13 2
|
4月前
|
Unix 网络安全 iOS开发
Mac 电脑如何安装Wireshark?
Mac 电脑如何安装Wireshark?
568 0
Mac 电脑如何安装Wireshark?
|
3月前
|
数据安全/隐私保护 Python
Python中Requests的深入了解
Python中Requests的深入了解
|
4月前
|
缓存 NoSQL MongoDB
Python之requests使用
Python之requests使用
|
4月前
|
SQL 关系型数据库 MySQL
Python3 notes
Python3 notes
|
4月前
|
消息中间件 SQL 运维
AIOps 智能运维:比专家经验更优雅的错/慢调用分析工具
本文主要介绍ARMS 错/慢 Trace 分析功能基本原理; 该功能能够覆盖哪些异常 Trace 根因; 最后会介绍一些最佳实践案例。
49879 22
|
4月前
|
Python
Python小姿势 - import requests
Python小姿势 - import requests
|
11月前
|
Python
Python分享之requests(3)
Python分享之requests(3)
|
数据采集 Python
Python|urllib库的一些应用
Python|urllib库的一些应用
82 0