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协程爬虫内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python实现下载整个ftp目录的方法

    python实现下载整个ftp目录的方法

    这篇文章主要介绍了python实现下载整个ftp目录的方法,文中给出了详细的示例代码,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友可以一起来学习学习。
    2017-01-01
  • Python大模型性能监控之日志分析工具的选型与使用

    Python大模型性能监控之日志分析工具的选型与使用

    本文探讨了大模型工程化监控中日志分析工具的选型与使用,重点介绍了相关技术原理和实现方法,文章还讨论了性能指标和优化方向,为读者提供了系统的知识框架和实践指导
    2026-06-06
  • Python中使用支持向量机SVM实践

    Python中使用支持向量机SVM实践

    这篇文章主要为大家详细介绍了Python中使用支持向量机SVM实践,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • python实操案例练习(七)

    python实操案例练习(七)

    这篇文章主要介绍了python实操案例练习,本文给大家分享的案例中主要任务有编写程序实现乐手弹奏乐器、使用面向对象设计自定义类,描述出租车和家用轿车的信息,需要的小伙伴可以参考一下
    2022-02-02
  • python+django+sql学生信息管理后台开发

    python+django+sql学生信息管理后台开发

    这篇文章主要为大家详细介绍了python+django+sql学生信息管理后台开发,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • python数据分析实战指南之异常值处理

    python数据分析实战指南之异常值处理

    数据预处理是明确分析目标与思路之后进行数据分析的第一步,也是整个项目中最基础、花费时间较长的工作,下面这篇文章主要给大家介绍了关于python数据分析实战指南之异常值处理的相关资料,需要的朋友可以参考下
    2022-01-01
  • 对Python 两大环境管理神器 pyenv 和 virtualenv详解

    对Python 两大环境管理神器 pyenv 和 virtualenv详解

    今天小编就为大家分享一篇对Python 两大环境管理神器 pyenv 和 virtualenv详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python获取文件路径、文件名、后缀名的实例

    python获取文件路径、文件名、后缀名的实例

    下面小编就为大家分享一篇python获取文件路径、文件名、后缀名的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • Linux使用python调用串口<Ubuntu>方式

    Linux使用python调用串口<Ubuntu>方式

    本文介绍在Ubuntu上使用Python和pyserial库进行串口通信的方法,涵盖安装库、编写收发代码及注意事项,适合初学者入门
    2026-05-05
  • tensorflow实现训练变量checkpoint的保存与读取

    tensorflow实现训练变量checkpoint的保存与读取

    今天小编就为大家分享一篇tensorflow实现训练变量checkpoint的保存与读取,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02

最新评论