requests案例:
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print('html:',response.text()[0:100],'status:',response.status)
aiohttp案例:
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.text(), response.status
async def main():
async with aiohttp.ClientSession() as session:
html, status = await fetch(session, 'https://www.baidu.com')
print(f'html:{html[:100]}')
print('status:', status)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
'''
aiohttp的请求方法的定义和之前requests的有明显的区别,主要包括以下几点
1. 在引入库的时候不止要引入aiohttp ,因为要实现异步爬取,还要引入asyncio库,启动协程,而协程要借助于asyncio里面的事件循环才能执行,除了事件循环
,asyncio库里面也提供了很多的异步操作
2. 因为要实现的异步操作,所有耗时的操作都要在前面加上 async 关键字来修饰
3.with as 语句前面同样需要加上async来修饰。在python中 with as语句用于声明一个上下文管理器,能帮助我们更好的自动分配和释放资源 而在前面加上一个async
就说明这个上下文支持异步的操作
4.对于一些要返回的协程对象的操作,需要加上await关键字 例如response的text方法 在aiohttp的官方文档中描述的是返回的是一个协程对象 所以前面要加上await方法
所以,这里可以根据实际情况 参考对应库的官方文档然后决定加不加await就可以了
5.最后定义完爬取方法后,实际上是main调用了fetch方法, 所以 要运行的话必须启动事件循环 而事件循环需要使用asyncio库,然后调用loop对象的run_until_complete方法
'''