Gointerface接口声明实现及作用详解
481
2022-09-06
aiohttp 异步http请求-1.快速入门 get 请求示例
前言
在 python 的众多 请求库中,大家最熟悉的就是 requests 库了,requests 库上手非常容易,适合入门学习。
如果平常工作中对发请求不追求效率和并发的情况下,requests 完全可以满足大部分需求。但是想发大量的请求,比如几万个请求的时候,可能需要等待几个小时,requests 库就不能满足需求了。
初学者建议先学习requests 库,熟练掌握requests 库才能更好的学习 aio异步框架。
同步与异步
requests只能发送同步请求,aioasyncio 异步 I/O - 实现并发+ aio库,发10个请求访问我的博客,那么这10个请求是串行的。
import requestsimport timeurl = "= time.time()for i in range(10): r = requests.get(url) print(r)print('总耗时:', time.time()-start_time)
我们想实现并发请求需用到 异步库 aioaio已安装,为了更好的学习 aio的功能,建议大家使用python3.7+版本, 我用的是python3.8版本
pip install aiopycharm 中安装
简单get 请求实现
首先导入 aio模块和 asyncio
import aioasyncio
现在,让我们尝试获取一个网页。例如让我们查询 aioasyncioasync def main(): async with aioas session: async with session.get('as resp: print(resp.status) print(await resp.text())# asyncio.run(main()) # 会报错,改成下面2句loop = asyncio.get_event_loop()loop.run_until_complete(main())
运行结果
200{ "args": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Host": " "User-Agent": "Python/3.8 aio "X-Amzn-Trace-Id": "Root=1-625ed4ea-5f44f6163dc3521845687df1" }, "origin": "183.193.27.228", "url": "是创建客户端session会话对象resp 是返回的response对象session.get 发get请求resp.status 获取返回对象状态码resp.text() 返回文本对象
前面是get请求示例,发一个 post 请求示例如下
session.post('data=b'data')
其他 HTTP 方法也可用:
session.put('data=b'data')session.delete('data=b'data')
为了使对同一个站点的多个请求更简单,可以使用构造函数的参数base_url ,例如请求不同的端点 可以使用以下代码:
import aioasyncioasync def main(): async with aioas session: async with session.get('/get') as resp1: print(resp1.status) async with session.post('/post', data=b'data') as resp2: print(resp2.status) async with session.put('/put', data=b'data') as resp3: print(resp3.status)# asyncio.run(main()) # 会报错,改成下面2句loop = asyncio.get_event_loop()loop.run_until_complete(main())
笔记
不要为每个请求创建会话。尽可能在每个应用程序中使用一个会话执行所有的请求。
更复杂的情况可能需要每个站点一个会话,例如一个用于 Github,另一个用于 Facebook API。无论如何,为每个请求创建一个会话是一个非常糟糕的主意。
会话内部包含一个连接池。连接重用和保持活动(默认情况下都打开)可以提高整体性能。
会话上下文管理器的使用不是强制性的,但在这种情况下应该调用方法,例如:await session.close()
session = aiowith session.get('...'): # ...await session.close()
在 URL 中传递参数
当url中带请求参数时,如params关键字参数将这些参数作为 提供
import aioasyncioasync def main(): async with aioas session: params = {'key1': 'value1', 'key2': 'value2'} async with session.get('params=params) as resp: expect = ' print(resp.url) assert str(resp.url) == expectloop = asyncio.get_event_loop()loop.run_until_complete(main())
运行打印结果:URL,您可以看到 URL 已正确编码。
如果同一个key有多个值的时候,如:= { 'key1': 'value1', 'key2': ['value2', 'value3'] }
也可以使用列表嵌套元祖
params = [ ('key1', 'value1'), ('key2', 'value2'), ('key2', 'value3') ]
也可以把字符串内容作为参数传递, 如params='key=value+1&key2=value2'.
async with session.get(' params='key=value+1&key2=value2') as r: print(r.url) assert str(r.url) == 'aioasyncioasync def main(): async with aioas session: async with session.get('as resp: print(resp.url)loop = asyncio.get_event_loop()loop.run_until_complete(main())
当请求参数带有中文的时候
params = { 'key1': 'value1', 'key2': '上海-悠悠' }
它会自动帮我们转成urlencode编码def main(): async with aioas session: params = { 'key1': 'value1', 'key2': '上海-悠悠' } async with session.get('params=params) as resp: print(resp.url)
响应内容和状态码
我们可以读取服务器响应的内容及其状态码
import aioasyncioasync def main(): async with aioas session: async with session.get('as resp: print(resp.url) print(await resp.text(encoding='utf-8')) loop = asyncio.get_event_loop()loop.run_until_complete(main())
打印出内容:
html>
aioresp.read())
打印结果
b'\n\n
\n \n ...'版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~