爬虫学习笔记--协程

单线程+异步协程
event_loop :时间循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件时,函数就会被执行
corouteine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即执行,而是返回一个协程对象。
task:任务,它是对协程对象的进一步封装,包含了任务的各个状态
future:代表将来执行火还没有执行的任务,实际上和task没有本质区别
asnyc 定义一个协程
await 用来挂起阻塞方法的执行

import asycio
def request():
	print('',url)
c=request('www.xxx.com')  #内部的程序语句不会马上执行
#创建一个事件循环对象
loop=asyncio.get_event_loop()
#将协程对象注册到loop中,然后启动loop
loop.run_until_complete(c)

task的使用

loop =asyncio.get_event_loop()
#基于loop创建一个task对象
loop.create_task(c)
loop.run_until_complete(task)

future的使用

loop =asyncio.get_event_loop()
task=asyncio.ensure_future(c)
loop.run_until_complete(task)

绑定回调
当任务对象相应成功只会,执行一定操作

def callback(task):
	print(task.result())
loop =asyncio.get_event_loop()
task=asyncio.ensure_future(c)
#将回调函数绑定到任务对象中
task.add_done_callback(callback)
#默认将任务对象作为参数传递给回调函数
loop.run_until_complete(task)

多任务异步协程

import asyncio
import time 
def request(url):
	print("...",url)
	#在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。
	#time.sleep(2) 不可用
	#当在asyncio遇到阻塞操作必须进行手动挂起,使用await
	await acyncio.sleep(2)
	print("over",url)
st=time.time()
urls=[
'www.baidu.com',
'www.sougou.com',
'www.douban.com'

]
#任务列表:存放多个任务对象
stask=[]
for i in urls :
	c=request(url)
	task=asyncio.ensure_future(c)
	stask.append(task)
loop=asyncio.get_event_loop()
#需要将任务列表封装到wait中
loop.run_until_complete(asyncio.wait(stasks))
ov=time.time()
print(ov-st)

aiohttp模块
环境安装 : pip install aiohttp
使用该模块中的session对象中的clientsession

async def getpage(url):
	async with aiohttp.ClientSession() as seesion :
	#get/post  请求发送
	#添加headers参数伪装 请求参数 get  params/post data
	async with await session.get(url,headers=headers) as response :
	#text()方法可以返回字符串形式数据
	#read()方法返回二进制数据
	#json()方法返回json对象
	#在获取响应数据操作之前一定要使用await进行手动操作挂起
	page_text =await reponse.text()
	print(page_text)
stask=[]
for i in urls :
	c=request(url)
	task=asyncio.ensure_future(c)
	stask.append(task)
loop=asyncio.get_event_loop()
#需要将任务列表封装到wait中
loop.run_until_complete(asyncio.wait(stasks))
ov=time.time()
print(ov-st)
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值