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。

  • 相关阅读:
    [IOS/翻译]Core Services Layer
    JEval使用实例
    Spring面试总结
    对easyui datagrid进行扩展,当滚动条拉直最下面就异步加载数据。
    虚拟机无法安装64位系统,是否说明硬件不支持?
    zh-cn,zh-tw,en-us,en-gb等网页语言代码一览表
    Python 计算程序运行时间
    美国教授是如何评价中国研究生的
    过来人谈在美国大学里的中国研究生
    javascript 十六进制与RGB颜色值的相互转换
  • 原文地址:https://www.cnblogs.com/awfj/p/11212411.html
Copyright © 2011-2022 走看看