aiohttp模块1 client
Make a Request
import aiohttp
async with aiohttp.ClientSession() as session:
async with session.get('https://api.github.com/events') as resp:
print(resp.status)
print(await resp.text())
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')
aiohttp.ClientSession.get(self, url, allow_redirects=True, **kwargs)
aiohttp.ClientSession.post(self, url, data=None, **kwargs)
aiohttp.ClientSession.put(self, url, data=None, **kwargs)
aiohttp.ClientSession.delete(self, url, **kwargs)
aiohttp.ClientSession.head(self, url, allow_redirects=False, **kwargs)
aiohttp.ClientSession.options(self, url, allow_redirects=True, **kwargs)
aiohttp.ClientSession.patch(self, url, data=None, **kwargs)
# 无须为每个request建立session. 仅需要为每个application建立session供所有request使用. session内部包含连接池,connection复用与长连接加速总性能。
Passing Parameters In URLs
# 字典
params = {'key1': 'value1', 'key2': 'value2'}
async with session.get('http://httpbin.org/get', params=params) as resp:
assert str(resp.url) == 'http://httpbin.org/get?key2=value2&key1=value1'
# 数组
params = [('key', 'value1'), ('key', 'value2')]
async with session.get('http://httpbin.org/get', params=params) as r:
assert str(r.url) == 'http://httpbin.org/get?key=value2&key=value1'
# 字符串
async with session.get('http://httpbin.org/get', params='key=value+1') as r:
assert str(r.url) == 'http://httpbin.org/get?key=value+1'
# aiohttp在发送请求前在内部自动对url进行转码,如URL('http://example.com/путь%30?a=%31') -> URL('http://example.com/%D0%BF%D1%83%D1%82%D1%8C/0?a=1')
# 使用encoded=True开关禁用, 如await session.get(URL('http://example.com/%30', encoded=True))
Response Content and Status Code
async with session.get('https://api.github.com/events') as resp:
print(resp.status)
print(await resp.text())
# out
200
'[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... '
# aiohttp自动对服务端返回的内容进行decode.可以使用text()方法自定义encode,如 await resp.text(encoding='windows-1251')
Binary Response Content
async with session.get('https://api.github.com/events') as resp:
print(await resp.read())
# out
b'[{"created_at":"2015-06-12T14:06:22Z","public":true,"actor":{... ]'
# gzip和deflate压缩算法,自动解码。brotli压缩算法需要安装 brotlipy 模块
JSON Request
async with aiohttp.ClientSession() as session:
async with session.post(url, json={'test': 'object'})
默认使用标准库json进行序列化,如果想快一点的话,可以使用第三方库ujson,但小小的不兼容
import ujson
async with aiohttp.ClientSession(json_serialize=ujson.dumps) as session:
async with session.post(url, json={'test': 'object'})
JSON Response Content
async with session.get('https://api.github.com/events') as resp:
print(await resp.json())
# 如果json解析失败,会抛出异常
Streaming Response Content
async with aiohttp.StreamReader() as session:
async with session.get('https://api.github.com/events') as resp:
await resp.content.read(10)
# read(), json(),text()将内容放在内存中,如果文件内容比较大,1G以上,需要使用 aiohttp.StreamReader 替代,它会对gzip和deflate压缩算法自动解码
with open(filename, 'wb') as fd:
while True:
chunk = await resp.content.read(chunk_size)
if not chunk:
break
fd.write(chunk)
# 写入文件
More complicated POST requests
payload = {'key1': 'value1', 'key2': 'value2'}
async with session.post('http://httpbin.org/post',
data=payload) as resp:
print(await resp.text())
# form-encoded data (HTML form), 使用字典,字典数据自动编码为form-encoded
{
...
"form": {
"key2": "value2",
"key1": "value1"
},
...
}
async with session.post(url, data=b'\x00Binary-data\x00') as resp:
...
# 非 form-encoded数据使用bytes类型,数据发送默认使用content-type ‘application/octet-stream’
async with session.post(url, json={'example': 'test'}) as resp:
...
# josn类型
async with session.post(url, text='Тест') as resp:
...
# content-type text类型
POST a Multipart-Encoded File
url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
await session.post(url, data=files)
url = 'http://httpbin.org/post'
data = FormData()
data.add_field('file',
open('report.xls', 'rb'),
filename='report.xls',
content_type='application/vnd.ms-excel')
await session.post(url, data=data)
# 上传文件对象,aiohttp使用stream
Streaming uploads
with open('massive-body', 'rb') as f:
await session.post('http://httpbin.org/post', data=f)
# 文件类型过大,使用Stream方式
@aiohttp.streamer
def file_sender(writer, file_name=None):
with open(file_name, 'rb') as f:
chunk = f.read(2**16)
while chunk:
yield from writer.write(chunk)
chunk = f.read(2**16)
# Then you can use file_sender as a data provider:
async with session.post('http://httpbin.org/post',
data=file_sender(file_name='huge_file')) as resp:
print(await resp.text())
async def feed_stream(resp, stream):
h = hashlib.sha256()
while True:
chunk = await resp.content.readany()
if not chunk:
break
h.update(chunk)
stream.feed_data(chunk)
return h.hexdigest()
resp = session.get('http://httpbin.org/post')
stream = StreamReader()
loop.create_task(session.post('http://httpbin.org/post', data=stream))
file_hash = await feed_stream(resp, stream)
r = await session.get('http://python.org')
await session.post('http://httpbin.org/post', data=r.content)
WebSockets
session = aiohttp.ClientSession()
async with session.ws_connect('http://example.org/websocket') as ws:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
if msg.data == 'close cmd':
await ws.close()
break
else:
await ws.send_str(msg.data + '/answer')
elif msg.type == aiohttp.WSMsgType.CLOSED:
break
elif msg.type == aiohttp.WSMsgType.ERROR:
break
Timeouts
async with session.get('https://github.com', timeout=60) as r:
...
# 默认IO操作延时5分钟,None 或者 0 禁用延时
# 使用async_timeout模块
import async_timeout
with async_timeout.timeout(0.001):
async with session.get('https://github.com') as r:
await r.text()
aiohttp模块1 client的更多相关文章
- SocketServer模块,hmac模块验证client合法性
hmac模块: 1.模块初识: import hmac # h = hmac.new() #括号里要给它连个bytes类型,一个是自定义的secret_key,一个是你想进行加密的bytes # 密文 ...
- Python学习---IO的异步[asyncio +aiohttp模块]
aiohttp aiohttp是在asyncio模块基础上封装的一个支持HTTP请求的模块,内容比8.4.2[基于asyncio实现利用TCP模拟HTTP请求]更全面 安装aiohttp: pip3 ...
- Python3中的http.client模块
http 模块简介 Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块. http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request ...
- aiohttp 支持异步的网络请求模块
通常在进行网络数据采集时候我们会用到requests,urllib等模块,但是这些模块在使用中并不支持异步,所以今天我们介绍一个支持异步网络请求的模块aiohttp. 首先我们使用flask简单的搭一 ...
- python的异步IO模块
asyncio模块:示例一 import asyncio @asyncio.coroutine def func1(): print('before...func1......') yield fro ...
- asynicio模块以及爬虫应用asynicio模块(高性能爬虫)
一.背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...
- 爬虫模块之解决IO
一 asyncio模块 asyncio模块:主要是帮我们检测IO(只能是网路IO). @asyncio.coroutine:装饰器 tasks:任务列表 get_event_loop:起任务 run_ ...
- 高性能爬虫——asynicio模块
一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调 ...
- 异步网络编程aiohttp的使用
aiohttp的使用 aiohttp Asynchronous HTTP Client/Server for asyncio and Python. Supports both Client and ...
随机推荐
- POJ - 2528 奇怪的测试数据
听说POJ内部测试数据有问题 我这份代码是WA的(UPD:第二份是AC代码),不过目前把discuss的数据试了一下没毛病 自己试了几组好像也没毛病? 感觉线段树部分的简单hash处理方法还是值得学习 ...
- 【总结】ettercap工具之arp欺骗
kali自带工具ettercap,使用前先开启IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward 1.以管理员身份打开ettercap,两种方式-G图形化 ...
- UltraEdit 21.3 增加 mssql, json 高亮
1. %appdata%\IDMComp\UltraEdit 2. 将msql2k.uew, json.uew 放到 wordfiles 目录即可 msql2k json的uew 下载地址如 ...
- BaaS_后端即服务 RESTful
码云coding API https://open.coding.net/ Swagger 官网用VPN能流畅打开,但它自己的基于web的编辑器不行 用来设计RESTful API LeanCloud ...
- Java基础17-成员变量、return关键字和多参方法
1.成员变量 在类中声明的变量为成员变量 //Dog类 class Dog{ String name;//成员变量 } public class Test1{ public static void m ...
- 安装clouderamaner时出现Failed to detect distribution错误(在ubuntu14.04版本里)
不多说,直接上干货! 在安装过程中,本来我的ubuntu系统都是14.04的. 问题详情 问题查看 解决办法 然后,再次执行安装即可. 欢迎大家,加入我的微信公众号:大数据躺过的坑 人 ...
- zookeeper在windows下的伪集群模式
参考:zookeeper在windows下的伪集群模式 踩到的坑: 注意windows下路径需要使用\ dataDir=D:\Program Files\Java\zookeeper-3.4.10-c ...
- 深度学习(五)基于tensorflow实现简单卷积神经网络Lenet5
原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/8954892.html 参考博客:https://blog.csdn.net/u01287127 ...
- 《Python编程从入门到实践》_第二章_变量和简单数据类型
什么是变量 举例: >>> message = "Hello,Python!" >>> print (message) Hello,Python ...
- FontAwesome 图标 class="fa fa-home"
本文转自:http://www.yeahzan.com/fa/facss.html 引用方式: class="fa fa-home" 注意:每个图标的引用都必须要添加 fa fa- ...