Python用yield form 实现异步协程爬虫( 二 )


  • 包工头(委派生成器):包含yield from表达式的生成器
  • 打工仔(子生成器):生成器函数
  • 其中委派生成器的作用:在主程序与子生成器之间建立一个双向通道 。所谓双向通道是指,主程序可以将参数通过send传递给子生成器,子生成器的yield的值也可以直接返回给主函数 。(PS:委派生成器只有创建通道的作用,没有拦截数据这种功能)也许有人会想直接用主程序调用子生成器不就行了,而对这的解释是,使用yield from作为中间过渡是为了让它帮我们进行异常处理(PS:类似写程序为了正常运行加上try一个道理)
    # -*- coding: utf-8 -*-# @Time    : 2022/11/10 15:13# @Author  : 红后# @Email   : not_enabled@163.com# @blog    : https://www.cnblogs.com/Red-Sun# @File    : coroutines.py# @Software: PyCharmimport requestsdef coroutines_spider():    '''    子生成器(PS: 打工仔,真正干活的)    '''    response = None  # 首次激活返回None,后期网页响应覆盖    while True:        url = yield response        response = requests.get(url)def appoint():    '''    委派生成器,委托子生成器完成具体任务 (PS: 类似包工头负责劳务派遣)    '''    while True:        yield from coroutines_spider()  # 建立子生成器和主函数的双通道def main(url_list: list):    '''    主函数(PS: 相当于老板,张贴招人启示)    '''    ul = appoint()  # 创建委派生成器    next(ul)  # 激活它    for url in url_list:        response = ul.send(url)  # 将url作为参数传递进入子生成器中,返回子生成器yield出来的response        print(response.url, response.status_code)  # 打印出response中的链接和状态码if __name__ == '__main__':    url_list = ['https://www.baidu.com/', 'https://www.4399.com/', 'https://cn.bing.com/', ]    main(url_list=url_list

    【Python用yield form 实现异步协程爬虫】

    经验总结扩展阅读