首页 > 编程语言 >Python用yield form 实现异步协程爬虫

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

时间:2022-11-14 15:47:45浏览次数:33  
标签:__ PS None 协程 form Python 生成器 yield url

很古老的用法了,现在大多用的aiohttp库实现,这篇记录仅仅用做个人的协程底层实现的学习。
争取用看得懂的字来描述问题。

1.什么是yield

如果还没有怎么用过的话,直接把yield看做成一种特殊的return(PS:本质 generator(生成器))
return是返回一个值然后就终断函数了,而yield返回的是一个生成器(PS:不知道的直接看作特殊列表,看下面的代码案例)

# -*- coding: utf-8 -*-
# @Time    : 2022/11/10 16:17
# @Author  : 红后
# @Email   : [email protected]
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : 实例1.py
# @Software: PyCharm

def main():
    '''
    遍历0到4,这五个数,并分别打印
    '''
    for num in range(5):
        yield num

if __name__ == '__main__':
    for num in main():
        print(num)
    print('-'*50)
    for num in [0, 1, 2, 3, 4]:
        print(num)


将它看作列表用for循环遍历,就能取出其中的值。

2.yield于列表的区别

它与原来列表的区别就在于,自带的列表是固定的,而把yield看作列表的话是动态的。
具体案例描述请看代码及备注(PS:个人自己描述的,有不对的地方望各位指点)

# -*- coding: utf-8 -*-
# @Time    : 2022/11/14 13:24
# @Author  : 红后
# @Email   : [email protected]
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : 实例2.py
# @Software: PyCharm

def main():
    '''
    将yield看作一个动态列表,从yield左往右为传出数据,从又往左为传入数据。
    PS:有yield存在的那一行,需要从左往右传出数据跑一遍,数据出去以后又要从又往左带接收的数据跑一遍,一共一行跑两边(仅作者个人记忆方法)
    '''
    num1 = yield
    num2 = yield
    print(num1, num2)
    yield num1 + num2
if __name__ == '__main__':
    a = main()
    # 第一个next对应第一个yield的右边为空即None,所以动态列表中加入一个参数为None,返回值为列表的-1位是None
    print(next(a))  # [None]
    # 第二个通过send方法传入一个数1,即在上一次停止的地方从右往左传入参数,所以给num1赋值为1.然后继续找下一个yield,其右边的值依旧为None,加入动态列表,此时返回值-1位依旧是None
    print(a.send(1))  # [None, None]
    # 第三通过send方法传入一个数2,即在上一次停止的地方从右往左传入参数,所以给num2赋值为2.然后继续找下一个yield,其右边的值为num1 + num2,此时num1为1,num2为2,计算得返回值-1位为3
    print(a.send(2))  # [None, None, num1 + num2]



3.yield from 实现协程

yield from 后面需要加可迭代对象
当它后面加上生成器(上述所说的yield这种)便可以实现生成的嵌套

  1. 老板(主程序):调用委派生成器
  2. 包工头(委派生成器):包含yield from表达式的生成器
  3. 打工仔(子生成器):生成器函数

其中委派生成器的作用:在主程序与子生成器之间建立一个双向通道。
所谓双向通道是指,主程序可以将参数通过send传递给子生成器,子生成器的yield的值也可以直接返回给主函数。(PS:委派生成器只有创建通道的作用,没有拦截数据这种功能)
也许有人会想直接用主程序调用子生成器不就行了,而对这的解释是,使用yield from作为中间过渡是为了让它帮我们进行异常处理(PS:类似写程序为了正常运行加上try一个道理)

# -*- coding: utf-8 -*-
# @Time    : 2022/11/10 15:13
# @Author  : 红后
# @Email   : [email protected]
# @blog    : https://www.cnblogs.com/Red-Sun
# @File    : coroutines.py
# @Software: PyCharm

import requests


def 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)

标签:__,PS,None,协程,form,Python,生成器,yield,url
From: https://www.cnblogs.com/Red-Sun/p/16889182.html

相关文章

  • python 双曲线 双坐标 上下X坐标轴 左右Y坐标轴
    raw=[52.34,52.85,52.61,52.77,52.27,53.13,53.24,52.98,52.36,53.57,52.91,53.21,52.25,52.24,50.83,50.63,49.93,47.62,48.52,48.4,48.0,47.62,......
  • python-docx操作word文档
    python-docx神器操作word文档1安装pip来安装:$pipinstallpython-docx2简单使用fromdocximportDocument#创建word文档document=Document()#添加段落......
  • Python -二叉树 创建与遍历算法(很详细)
    树表示由边连接的节点。它是一个非线性的数据结构。它具有以下特性。一个节点被标记为根节点。除根节点之外的每个节点都与一个父节点关联。每个节点可以有一个arbiatry编号......
  • 用C语言为python写C扩展
    calc.c#include<stdio.h>#include<Python.h>intadd(intx,inty){//C函数returnx+y;}staticPyObject*calc_add(PyObject*self,PyObject*args){......
  • python-时间模块-3大常见时间处理模块-datatime(八)
    1.datatime模块datetime是python中处理日期时间的标准库,datetime模块中常用的类包括date,time,datetime,timedelta,使用这些对象支持日期时间的数学运算和更有效的解析......
  • Python 代码托管到码云平台,原来这么简单!!
    一、什么是代码托管?代码托管又有什么好处?场景1:我有2个电脑,公司一台,家里一台。我想在两台电脑上都进行同步开发。这时候我只要gitpush/pull一下就能够同步了,不再需要用U......
  • Python 自动化中三种等待时间的详解
    自动化测试,是交由机器来执行的一种测试手段,用于提升测试效率,意味着每一次的自动化测试都需要有非常高的成功率,才可以达到提升效率的作用。在自动化测试中,其实就是通过代码......
  • Python量化中用pyecharts画K线示例
    首先需要安装Python软件,以及pyecharts库相关教程链接:龙哥量化:文档目录(股票,期货,通达信、同花顺、文华等软件使用,Python量化交易,策略编写,学习文档,策略案例等等) 1"""......
  • python量化指标计算talib函数功能一览表
    安装talib库:pipinstalltalib 1#取个数据验证一下2set_token('')3data=history(symbol='SHSE.600519',frequency='1d',start_time='2015-01-01',......
  • 90 条简单实用的 Python 编程技巧,建议收藏
    编码原则建议1:理解Pythonic概念—-详见Python中的《Python之禅》建议2:编写Pythonic代码避免不规范代码,比如只用大小写区分变量、使用容易混淆的变量名、害怕......