aiohttp模块是python是基于异步的网络请求第三方模块
在aiohttp模块中,发起一个session请求需要创建一个ClientSession对象
import asyncio,aiohttp
async def fetch_async(url):
print(url)
# 如果要自定义cookie,则要在创建对象的时候引入
async with aiohttp.ClientSession(cookie=自定义cookie字典) as session:
# 跟requests一样的请求方式
# requests是基于同步
# aiohttp是基于异步
# 如果要携带参数的话,直接字典传入params参数
# 代理使用proxy参数
asycn with session.get(url) as resp:
print(resp.status)
# text()返回字符串的响应数据
# read()返回二进制的响应数据
# json()返回json类型响应数据
print(await resp.text())
'''
除了上面的请求方式外
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')
'''
cookie总结:
当我们使用rp.cookie时,只会获取到当前url下设置的cookie,不会维护整站的cookie
而session.cookie_jar.filter_cookies(“https://segmentfault.com”)会一直保留这个网站的所有设置cookies,含有我们在会话时设置的cookie,并且会根据响应修改更新cookie。这个才是我们需要的
而我们设置cookie,也是需要在aiohttp.ClientSession(cookies=cookies)中设置
text(),read(),json()都是直接把整个响应体读入内存,如果要获取大量数据,请考虑使用字节流读取数据,我们获取的session.get()是Response对象,继承与StreamResponse
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)
TcpConnector维持链接池,限制并行链接的总量,当池满了,有请求退出再加入新请求
async def func1():
cookies = {'my_cookie': "my_value"}
conn = aiohttp.TCPConnector(limit=2) #默认100,0表示无限
async with aiohttp.ClientSession(cookies=cookies,connector=conn) as session:
for i in range(7,35):
url = "https://www.ckook.com/list-%s-1.html"%i
async with session.get(url) as rp:
print('---------------------------------')
print(rp.status)