最近在学习aiohttp,犯了个很低级的错误,特此记录下。
错误描述:
我使用aiohttp的session去访问我自己的csdn首页(https://blog.csdn.net/jss19940414)的时候,因为响应可用text(),json
(),read()进行获取,但是这些都是直接放在缓存中,如果信息过大的时,缓存爆炸,所以我使用流(content)来进行获取。
代码如下:
import asyncio
import aiohttp
async def get(session, url):
async with session.get(url)as res:
return await res.content().read(100)
async def main():
async with aiohttp.ClientSession() as session:
html = await get(session, "https://blog.csdn.net/jss19940414")
print(html)
print(type(html))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
结果报错,如下:
Traceback (most recent call last):
File "F:/project/learn/携程_爬虫4_aiohttp_4_获取流式响应.py", line 19, in <module>
loop.run_until_complete(main())
File "G:\anaconda\lib\asyncio\base_events.py", line 467, in run_until_complete
return future.result()
File "F:/project/learn/携程_爬虫4_aiohttp_4_获取流式响应.py", line 12, in main
html = await get(session, "https://blog.csdn.net/jss19940414")
File "F:/project/learn/携程_爬虫4_aiohttp_4_获取流式响应.py", line 7, in get
return await res.content().read(100)
TypeError: 'StreamReader' object is not callable
TypeError: 'StreamReader' object is not callable,,竟然报错了,有点懵,百度了一下,我的天啊,脑子坏掉了。
分析:
响应的content是一个属性,并不是一个函数。
正确代码:
import asyncio
import aiohttp
async def get(session, url):
async with session.get(url)as res:
return await res.content.read(100)
async def main():
async with aiohttp.ClientSession() as session:
html = await get(session, "https://blog.csdn.net/jss19940414")
print(html)
print(type(html))
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
执行结果: