python爬虫之协程全集

本文深入探讨了Python协程的概念及其在爬虫中的应用,通过实例展示了从同步到异步,再到多任务同步和协程的转换过程,涵盖了aiohttp的get和post请求,以及参数传递和异步读写。通过学习,读者可以全面理解Python协程在并发任务中的优势和使用技巧。
摘要由CSDN通过智能技术生成

1、同步代码:

import time

def run(index):
    print("lucky is a good man", index)
    time.sleep(2)
    print("lucky is a nice man", index)

for i in range(1, 5):
    run(i)

运行结果:

lucky is a good man 1
lucky is a nice man 1
lucky is a good man 2
lucky is a nice man 2
lucky is a good man 3
lucky is a nice man 3
lucky is a good man 4
lucky is a nice man 4

2、异步执行

import time
import asyncio


async def run(i):
    print("lucky is a good man", i)
    # 模拟一个耗时IO
    await asyncio.sleep(2)
    print("lucky is a nice man", i)


if __name__ == "__main__":
    # loop = asyncio.get_event_loop()  此方法已弃用,使用会报错
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    tasks = []
    t1 = time.time()

    for url in range(1, 5):
        coroutine = run(url)
        task = asyncio.ensure_future(coroutine)
        tasks.append(task)
    loop.run_until_complete(asyncio.wait(tasks))
    t2 = time.time()
    # %.2f 是固定格式,表示保留两位小数
    print("总耗时:%.2f" % (t2 - t1))

运行结果:

lucky is a good man 1
lucky is a good man 2
lucky is a good man 3
lucky is a good man 4
lucky is a nice man 1
lucky is a nice man 3
lucky is a nice man 2
lucky is a nice man 4
总耗时:2.01

3、简单异步:

import asyncio


async def run():
    print('run函数开始')
    #  这个位置的asyncio.sleep()  用于携程对象中的阻塞等待
    await asyncio.sleep(2)
    print('run函数结束')


if __name__ == '__main__':
    con = run()
    asyncio.run(con)

运行结果:

run函数开始
run函数结束

4、多任务同步:

import time

def run(url):
    print(f'开启请求{url}的数据')
    time.sleep(2)
    print(f'结束请求{url}的数据')
    data = url + '的抓取数据'
    return data

if __name__ == '__main__':
    url_list = ['baidu.com', 'taobao.com', 'aqiyi.com']
    for i in url_list:
        run(i)

运行结果:

开启请求baidu.com的数据
结束请求baidu.com的数据
开启请求taobao.com的数据
结束请求taobao.com的数据
开启请求aqiyi.com的数据
结束请求aqiyi.com的数据

5、协程多任务:

import time
import asyncio

async def run(url):
    print(f'开启请求{url}的数据')
    await asyncio.sleep(2)
    print(f'结束请求{url}的数据')
    data = url + '的抓取数据'
    return data

# 接收返回值
def call_back(f):
    print(f.result())

if __name__ == '__main__':
    t1 = time.time()
    # loop = asyncio.get_event_loop()  # 此方法已弃用
    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)
    url_list = ['baidu.com', 'taobao.com', 'aqiyi.com']
    tasks = []  # 包含多个task任务的对象
    for i in url_list:
        con = run(i)
        # 开启消息循环
        task = asyncio.ensure_future(con)
        # 添加回调函数
        task.add_done_callback(call
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值