python爬虫进阶之协程详解

 更新时间:2023年08月09日 10:58:54   作者:南岸青栀*  
这篇文章主要介绍了python爬虫进阶之协程详解,coroutine中文翻译叫协程,在 Python 中昌指代为协程对象类型,可以将协程对象注册到时间循环中被调用,需要的朋友可以参考下

python爬虫–协程

基本知识

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

协程的基本使用

import asyncio
async def request(url):
    print('正在请求的url是:',url)
    print('请求成功:',url)
#async修饰的函数,调用之后返回的一个协程对象
c = request('www.baidu.com')
# #创建一个事件循环对象
# loop = asyncio.get_event_loop()
#
# #将携程对象注册到loop中,然后启动loop
# loop.run_until_complete(c)
# #task的使用
# loop = asyncio.get_event_loop()
# #基于loop创建一个task对象
# task = loop.create_task(c)
# print(task)
# loop.run_until_complete(task)
# print(task)
#future的使用
loop = asyncio.get_event_loop()
task = asyncio.ensure_future(c)
print(task)
loop.run_until_complete(task)
print(task)

多任务协程实现

import asyncio
import time
async def request(url):
    print('正在请求的url是:',url)
    #在异步协程中如果出现同步模块相关的代码,那么就无法实现异步
    #time.sleep(2)
    await asyncio.sleep(2)
    print('请求成功:',url)
#async修饰的函数,调用之后返回的一个协程对象
start = time.time()
urls = {
    'www.123.com',
    'www.234.com',
    'www.345.com'
}
#存放多个任务对象
stask = []
for url in urls:
    c = request(url)
    task = asyncio.ensure_future(c)
    stask.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(stask))
print(time.time()-start)

多任务协程异步实现

在进行多任务协程实现前,还需要建立一个简单的本地http服务

from flask import Flask
import time
app = Flask(__name__)
@app.route('/azb')
def index_azb():
    time.sleep(2)
    return 'Hello azb'
@app.route('/xx')
def index_xx():
    time.sleep(2)
    return 'Hello xx'
@app.route('/hh')
def index_hh():
    time.sleep(2)
    return 'Hello hh'
if __name__ == '__main__':
    app.run(threaded=True)

在这里插入图片描述

实现

import requests,asyncio,time
start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]
async def get_page(url):
    print('正在下载',url)
    #request是基于同步,必须使用基于异步的网络请求模块
    response = requests.get(url=url)
    print('下载成功!',url)
tasks = []
for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print('总耗时',time.time()-start)

在这里插入图片描述

aiohttp模块引入

import requests,asyncio,time,aiohttp
start = time.time()
urls = [
    'http://127.0.0.1:5000/azb','http://127.0.0.1:5000/xx','http://127.0.0.1:5000/hh'
]
async def get_page(url):
    async with aiohttp.ClientSession() as session:
        async with await session.get(url) as response:
            #text()返回字符串形式的响应数据
            #read()返回的二进制形式的响应数据
            #json()返回的就是json对象
            #获取响应数据操作之前一定要使用await进行手动挂起
            page_text = await response.text()
            print(page_text)
tasks = []
for url in urls:
    c = get_page(url)
    task = asyncio.ensure_future(c)
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
print('总耗时',time.time()-start)

在这里插入图片描述

到此这篇关于python爬虫进阶之协程详解的文章就介绍到这了,更多相关python协程爬虫内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 利用OpenCV实现YOLO对象检测方法详解

    利用OpenCV实现YOLO对象检测方法详解

    这篇文章主要介绍了如何使用YOLOV3对象检测器、OpenCV和Python实现对图像和视频流的检测。文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-01-01
  • 看看如何用Python绘制小米新版天价logo

    看看如何用Python绘制小米新版天价logo

    这篇文章主要介绍了看看如何用Python绘制小米新版天价logo,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • python中torch.nn.identity()方法详解

    python中torch.nn.identity()方法详解

    今天看源码时遇到的这个恒等函数,就如同名字那样占位符,并没有实际操作,下面这篇文章主要给大家介绍了关于python中torch.nn.identity()方法的相关资料,需要的朋友可以参考下
    2022-03-03
  • Python设计模式之中介模式简单示例

    Python设计模式之中介模式简单示例

    这篇文章主要介绍了Python设计模式之中介模式,简单介绍了中介模式的概念、功能,并结合实例形式给出了Python定义与使用中介模式的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • opencv-python的RGB与BGR互转方式

    opencv-python的RGB与BGR互转方式

    这篇文章主要介绍了opencv-python的RGB与BGR互转方式,具有很好的参考价值,希望对大家有所 帮助。一起跟随小编过来看看吧
    2020-06-06
  • Python Nose框架编写测试用例方法

    Python Nose框架编写测试用例方法

    这篇文章主要介绍了Python Nose框架编写测试用例方法,需要的朋友可以参考下
    2017-10-10
  • python标准库中inspect模块的简单说明

    python标准库中inspect模块的简单说明

    这篇文章主要介绍了python标准库中inspect模块的简单介绍,inspect模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象,需要的朋友可以参考下
    2023-08-08
  • 详解Python调用系统命令的六种方法

    详解Python调用系统命令的六种方法

    这篇文章主要介绍了详解Python调用系统命令的六种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  •  Java SE 面向对象编程的3个常用接口

     Java SE 面向对象编程的3个常用接口

    这篇文章主要f Java SE 面向对象编程的3个常用接口,Comparable、Comparator 比较器、Cloneable,下面文章详细介绍,需要的小伙伴可以参考一下
    2022-01-01
  • 五分钟学会怎么用python做一个简单的贪吃蛇

    五分钟学会怎么用python做一个简单的贪吃蛇

    这篇文章主要介绍了五分钟学会怎么用python做一个简单的贪吃蛇,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-01-01

最新评论