介绍
aiohttp是python的一个异步网络模块,包含客户端和服务端模块。
相比requests模块,除了是异步写法外,大同小异,其速度比requests模块快。
python的多线程有全局解释器锁(GIL),使用多线程实际上同一时刻仅有一个线程在执行,使用协程的相对比较快,可以再配合多进程使用。
基本用法
安装
使用pip命令安装即可。
pip install aiohttp
发起请求
aiohttp
模块需要配合python 自带的
asyncio
模块使用,以下代码为发起客户端发起一个get请求。
# _*_ coding:utf8_*_
import asyncio
import aiohttp
async def fetch(session, url):
"""
获取网页html代码
:param session:
:param url:
:return:
"""
async with session.get(url) as response:
return await response.text()
async def main():
"""
:return:
"""
async with aiohttp.ClientSession() as session:
html = await fetch(session, "http://blog.fenlanli.com")
print(html)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
其他http请求方法均有提供方便使用的函数:
url = ""
session.put(url, data='data')
session.delete(url)
session.head(url)
session.patch(url, data='data')
session.post(url, data='data')
还提供了一个request函数,可以动态的选择请求方式。
session.request('get', url, data={'key': 'val'})
参数传递
get方法
跟requests模块中的GET请求传参数是一样的。
params = {'key': 'value'}
async with session.get(url, params=params) as response:
return await response.text()
post方法
提交文本数据:
async def post_data(session, url):
"""
提交数据
:param session:
:param url:
:return:
"""
data = 'data'
async with session.post(url, data=data) as response:
return await response.text()
提交json数据:
async def fetch(session, url):
"""
提交数据
:param session:
:param url:
:return:
"""
data = {'key': 'val'}
async with session.post(url, json=data) as response:
return await response.text()
获取返回值
一般常用的是获取文本内容或者json数据。
获取文本数据:
async with session.post(url, json=data) as response:
return await response.json()
获取json数据:
async with session.post(url, json=data) as response:
return await response.json()
自定义请求头
设置session的cookies参数即可:
async def fetch(session, url):
"""
提交数据
:param session:
:param url:
:return:
"""
headers = {
'User-Agent': 'User-Agent'
}
async with session.get(url, headers=headers) as response:
return await response.text()
设置cookies
设置session的参数cookies即可:
async def fetch(session, url):
"""
提交数据
:param session:
:param url:
:return:
"""
cookies = {'cookies_are': 'working'}
async with session.get(url, cookies=cookies) as response:
return await response.text()
使用代理
设置session的参数proxy即可:
async def fetch(session, url):
"""
提交数据
:param session:
:param url:
:return:
"""
proxy = "http://my.proxy.cn"
async with aiohttp.ClientSession() as session:
async with session.get(url, proxy=proxy) as resp:
print(resp.status)
至此,对于普通网站的爬虫基本够用了。
个人博客