前面博客讲的太泛了,对于我搞爬虫就细化学习理解一波,基于这篇博客的学习
由于requests库和asyncio库是不能一起使用的,所以我们要安装一点小插件pip install aiohttp
先上代码
import asyncio
import aiohttp
async def func(url):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
print('开始下载',url)
async with aiohttp.ClientSession() as session:
async with await session.get(url=url,headers=headers) as response:
data = await response.read()
name = url.split('/')[-1]
with open(name,'wb') as fp:
fp.write(data)
print('下载完成',url)
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
]
tasks=[]
for url in urls:
a = func(url)
task = asyncio.ensure_future(a)
tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
基本步骤:
- 导入库
这里注意不使用requests
了,直接使用aiohttp
import asyncio
import aiohttp
- 建立任务单
urls = ['https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_01.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_02.png',
'https://ziyuan.jumpw.com/heroactivity/cases2020/anniversary/images/img_03.png'
]
- 用循环对每一条任务进行操作
for url in urls:
- 创建协程对象
a = func(url)
- 将任务封装
使用asyncio.ensure_future()
来封装
ensure_future
其实是用来创建任务的
tasks = [] # 这个写在循环外面
task = asyncio.ensure_future(a)
tasks.append(task)
- 建立事件循环
利用asyncio.get_event_loop()
创建事件循环
loop = asyncio.get_event_loop()
- 把任务列表放到事件循环里面
运行
运用这个函数执行运行任务单.run_until_complete()
这个函数的参数是future或者协程
这个函数asyncio.wait()
叫简单等待
如果参数可以是一个任务单列表,如果里面有协程(或者其他的可等待对象)它将自动作为任务加入日程。
loop.run_until_complete(asyncio.wait(tasks))
- 定义一个爬虫协程
这个爬虫的特点是url要从外面导入
注意的是aiohttp
的使用
格式比较固定,套着用就是了
async def func(url):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
}
print('开始下载',url)
# 类似于上下文管理器,就是with open,with前面一定要加async,固定写法
# as session是类似起名字一样
async with aiohttp.ClientSession() as session:
# async with跟上面同理,await是手动挂起,因为向图片发起请求是IO操作
async with await session.get(url=url,headers=headers) as response:
# 同样的,对返回的数据进行解析也是IO操作
# 不同于requests模块,read()指的是解析二进制数据
# text() 就是我们平时用的text
# 而json对象则要用json()
data = await response.read()
name = url.split('/')[-1]
with open(name,'wb') as fp:
fp.write(data)
print('下载完成',url)
- 运行一波
啪的一下很快啊