当前位置:博客首页 > Python > 正文

aiohttp基础用法【入门】

作者: Jarvan 分类: Python 发布时间: 2020-07-13 22:13 百度已收录

一、定义:

aiohttp是什么,官网上有这样一句话介绍:Async HTTP client/server for asyncio and Python,翻译过来就是 asyncio和Python的异步HTTP客户端/服务器

二、特征:

支持客户端和HTTP服务器。 无需使用Callback Hell即可支持Server WebSockets和Client WebSockets。 Web服务器具有中间件,信号和可插拔路由。

三、常见用法:

基础用法:

async with aiohttp.get('https://github.com') as r:---异步发起请求
await r.text()-----异步操作

设置超时时间:

with aiohttp.Timeout(0.001):
async with aiohttp.get('https://github.com') as r:
await r.text()

构建session:

async with aiohttp.ClientSession() as session:
async with session.get('https://api.github.com/events') as resp:
print(resp.status)
print(await resp.text())

构建headers:

url = 'https://api.github.com/some/endpoint'
headers = {'content-type': 'application/json'}
await session.get(url, headers=headers)

使用代理:

conn = aiohttp.ProxyConnector(proxy="http://some.proxy.com")----创建代理
session = aiohttp.ClientSession(connector=conn)
async with session.get('http://python.org') as resp:
print(resp.status)
conn = aiohttp.ProxyConnector(
proxy="http://some.proxy.com",
proxy_auth=aiohttp.BasicAuth('user', 'pass')
)
session = aiohttp.ClientSession(connector=conn)
async with session.get('http://python.org') as r:
assert r.status == 200

自定义cookie:

url = 'http://httpbin.org/cookies'
async with ClientSession({'cookies_are': 'working'}) as session:
async with session.get(url) as resp:
assert await resp.json() == {"cookies": {"cookies_are": "working"}}

参考文章:Async与aiohttp介绍

四、使用举例:

1)aiohttpasyncio的使用举例,异步请求和抓取多个页面

import aiohttp
import asyncio
import time

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def main():

    urls = ['https://news.sina.com.cn/c/2020-07-14/doc-iivhuipn2814714.shtml','http://httpbin.org/headers','https://news.sina.com.cn/c/2020-07-13/doc-iivhvpwx5174850.shtml','http://astro.sina.com.cn/v/ss/2020-07-10/doc-iirczymm1612881.shtml']
    start = time.time()
    for url in urls:
        async with aiohttp.ClientSession(headers=None, cookies=None) as session:  # 可不填headers和cookies
            html = await fetch(session, url)
            print(len(html))
    time_consuming = time.time() - start
    print('{:.2f}'.format(time_consuming))

if __name__ == "__main__":
    asyncio.run(main())

五、扩展学习

1)uvloop不支持windows操作系统,使用时需注释掉

2)SanicDB 是为 Python 的异步 Web 框架 Sanic 方便操作 MySQL 而开发的工具,是对 aiomysql.Pool 的轻量级封装。

Sanic 是异步IO的Web框架,同时用异步IO读写MySQL才能更大发挥它的效率。

虽然这个模块叫做 SanicDB,但是它可以用在任何异步IO操作MySQL的地方。

参考:SanicDB:简化 Python 异步 Web 框架 Sanic 操作 MySQL