aiohttp模块

aiohttp模块

aiohttp模块是python是基于异步的网络请求第三方模块

session请求

在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)

你可能感兴趣的:(python,开发语言,python)