提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
协程就是异步爬取 能够快速的爬取数据 高效利用CPU 当发生等待事件 就可以执行其他的任务
一、引入库
import asyncio
#import requests 正步代码 异步会被中断
import aiohttp
import aiofiles
import time
二、使用步骤
1.上代码
代码如下(示例):
import asyncio
#import requests 正步代码 异步会被中断
import aiohttp
import aiofiles
import time
async def download(url): #用async返回函数可以当成是异步对象
#url = "http://kr.shanghai-jiuxin.com/file/2020/1031/563337d07af599a9ea64e620729f367e.jpg"
name = url.rsplit("/",1)[1]
async with aiohttp.ClientSession() as session: #aiohttp.ClientSession() 等价于 requests
async with session.get(url) as resp:#get请求的时候会花时间
async with aiofiles.open(name,mode="wb") as f: #with能够操控文件管理 自动close()
await f.write(await resp.content.read()) #resp.content.read()等价于resp.content
#上面两个部分都需要等待 一个是写 一个是读取
print(name,"搞定")
async def main():
urls = ["http://kr.shanghai-jiuxin.com/file/2020/1031/563337d07af599a9ea64e620729f367e.jpg",
"http://kr.shanghai-jiuxin.com/file/2020/1031/small191468637cab2f0206f7d1d9b175ac81.jpg",
"http://kr.shanghai-jiuxin.com/file/2020/1031/smalld7de3f9faf1e0ecdea27b73139fc8d3a.jpg"]
tasks = [] #存储异步对象
for url in urls:
tasks.append(asyncio.create_task(download(url)))
await asyncio.wait(tasks)
if __name__ == '__main__':
t1 = time.time()
asyncio.run(main())
t2 = time.time()
print(t2-t1)#测试运行时间
该处使用的url网络请求的数据。
总结
需要注意的就是tasks里面的元素在继python3.8的时候 要记得用asyncio.creat_task(来获得元素) 不然会报错 图片的url的话 可以先用同步获取 异步也行