zoukankan      html  css  js  c++  java
  • 单线程+异步协程

    更高效的异步爬虫

    import asyncio
    import aiohttp
    import time
    #回调函数:解析响应的数据
    def callback(task):
        print("这是解析的回调")
        #获取到响应数据
        page_text = task.result()
        # print("进行解析",page_text)
        return "hhahah"
    #定义一个特殊的函数,协程
    async def get_page(url):
        #用aiohttp 发送请求 aiohttp支持异步
        async with aiohttp.ClientSession() as request:
            async with request.get(url=url) as response:
                page_text = await response.text() # read() json()
                return page_text
    s = time.time()
    
    tasks = []
    urls = ['https://www.baidu.com',
            'https://uland.taobao.com',
            'https://www.jd.com']
    # 创建一个事件循环对象
    loop = asyncio.get_event_loop()
    
    for url in urls:
        c = get_page(url)
        task = asyncio.ensure_future(c)
        # 给任务对象绑定回调函数用于解析相应数据
        task.add_done_callback(callback)
        tasks.append(task)
    
    # 蒋多个任务对象对应的列表注册到事件循环中
    loop.run_until_complete(asyncio.wait(tasks))
    print(time.time() - s)
    View Code
    • event_loop:事件循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足条件发生的时候,就会调用对应的处理方法。

    • coroutine:中文翻译叫协程,在 Python 中常指代为协程对象类型,我们可以将协程对象注册到时间循环中,它会被事件循环调用。我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即被执行,而是返回一个协程对象。

    • task:任务,它是对协程对象的进一步封装,包含了任务的各个状态。

    • future:代表将来执行或没有执行的任务的结果,实际上和 task 没有本质区别。

    • async:async 定义一个协程。
    • await:await 用来挂起阻塞方法的执行。
    • aiohttp:支持异步发送请求

      注意:

      async/await 关键字,它是从 Python 3.5 才出现的,专门用于定义协程。

      asyncio只能发tcp级别的请求,不能发http协议。

      requests不是异步请求方式,发送请求要用到aiohttp。

  • 相关阅读:
    Windows Driver Mode 1
    一个程序员的奋斗经历 2
    JavaScript判断文件是否存在
    流程图个图标详解
    wget for windows
    软件的开发周期
    Firefox支持activex的插件
    第二次作业
    C/C++字符串使用整理
    c#学习小记录(1)
  • 原文地址:https://www.cnblogs.com/awfj/p/11212411.html
Copyright © 2011-2022 走看看