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。

  • 相关阅读:
    85. Maximal Rectangle
    120. Triangle
    72. Edit Distance
    39. Combination Sum
    44. Wildcard Matching
    138. Copy List with Random Pointer
    91. Decode Ways
    142. Linked List Cycle II
    异或的性质及应用
    64. Minimum Path Sum
  • 原文地址:https://www.cnblogs.com/awfj/p/11212411.html
Copyright © 2011-2022 走看看