twisted的task之cooperator和scrapy的parallel()函数

本文是关于下载结果返回后调用item处理的过程实现研究。

从scrapy的结果处理说起

def handle_spider_output(self, result, request, response, spider):
    if not result:
        return defer_succeed(None)
    it = iter_errback(result,
self.handle_spider_error, request, response, spider)
    dfd = parallel(it,
self.concurrent_items,
                  
self._process_spidermw_output, request, response, spider)
    return dfd

result是deferred的返回结果,它是一个生成器,实质是spider中parse方法的返回。

iter_errback是一个包装,用于迭代异常时调用错误处理函数

def iter_errback(iterable, errback, *a, **kw):
    """Wraps
an iterable calling an errback if an error is caught while
    iterating it.
    """
   
it = iter(iterable)
    while True:
        try:
            yield next(it)
        except StopIteration:
            break
        except
:
            errback(failure.Failure(),
*a, **kw)

回到handle_spider_output,看一下parallel

# scrapy/utils/defer.py

def parallel(iterable, count, callable, *args,
**named):
    """Execute
a callable over the objects in the given iterable, in parallel,
    using no more than ``count``
concurrent calls.

Taken from:
http://jcalderone.livejournal.com/24285.html
    """
   
coop =
task.Cooperator()
    work = (callable(elem, *args,
**named) for elem in iterable)
    return defer.DeferredList([coop.coiterate(work)
for _ in range(count)])

它不是很好理解,

关于cooperator()功能见其它文档

要理解的有以下几点:

  1. coop.coiterate(work)返回的是一个deferred,如果给定的迭代器执行完成或异常,会触发这个deferred的回调;
  2. 再给这些返回的deferred加上一个包装deferredlist,意为当它们的回调都被触发后会触发deferredlist的回调;
  3. 对于deferredlist的中多个对象来说,它们意味着cooperator对象中的_task列表有多个worker,而这些worker所指向的迭代器是一致的,即传入的work,所以不存在混乱问题,但work中的每次迭代具体由哪个worker执行及执行顺序是无法保证的,所以work迭代出的执行片段应该具有原子性。

就执行结果而言,count实质上是爬虫的item并发数量限制,_process_spidermw_output实质上是调用itemmanager的process_item,也就是依次调用所有pipeline的process_item处理result迭代出的内容。

scrapy item处理----cooperator和parallel()函数的更多相关文章

  1. 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...

  2. 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制

    用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l  查看scrapy创建爬虫文件可用的母版 Available templates: ...

  3. 第十篇 scrapy item loader机制

    在我们执行scrapy爬取字段中,会有大量的和下面的代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制 def parse_detail(sel ...

  4. python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制

    这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...

  5. scrapy item

    item item定义了爬取的数据的model item的使用类似于dict 定义 在items.py中,继承scrapy.Item类,字段类型scrapy.Field() 实例化:(假设定义了一个名 ...

  6. [scrapy]Item Loders

    Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...

  7. scrapy item pipeline

    item pipeline process_item(self, item, spider) #这个是所有pipeline都必须要有的方法在这个方法下再继续编辑具体怎么处理 另可以添加别的方法 ope ...

  8. 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL

    传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...

  9. Item 17: 理解特殊成员函数的生成规则

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...

随机推荐

  1. HTML的网页基本结构

    写在前面 <!DOCTYPE html><html lang="en"><head>            <meta charset=& ...

  2. openresty + lua

    lua语法总结: 1. 导入模块(用require来加载,模块是一个类型为table的全局变量) 导入写好的包,举例如下: 2. lua 数据类型(有8种:nil.boolean.number.str ...

  3. 怎么把项目发布到github上

    方法一:在github上新建一个项目,然后在本地任意个文件夹(最好新建)右键 git bash here   ,再之后 git clone https://github.com/CKTim/BlueT ...

  4. Python结束当前运行的代码

    import sys print(0) print(1) print(2) # 到此结束运行 sys.exit() # 已结束,以下不会执行 print(4) print(5)

  5. Windows server 2012文件服务器配置

    文件服务器的管理   Windows server 2012提供了易于使用的管理工具,让系统管理员更有效的管理服务器的资源. 安装文件服务器管理工具 添加角色-安装管理器 安装完成后直接可以在工具中打 ...

  6. php截取富文本框中的固定长度的字符

    ai,哎怎么赶脚自己写东西越来越小儿科了呢,现在连这个问题都找了好半天 因为后台是的内容是富文本编辑器编辑的,前台我傻逼的直接截取了字符串,然后样式啥的都乱了,找了半天是因为富文本的问题 其实解决办法 ...

  7. python中的数学类型及操作

    一.概述 整数类型 浮点数类型 复数类型 round()函数 数值运算符 数值运算函数 字符串类型 1.整数类型 整型:用来描述什么:比如身高,体重,年龄等 eg: age=20 height=168 ...

  8. 汪莹:以RELX悦刻为例,复盘中国品牌出海的跨文化挑战

    海外销售额每月2倍增速,3个月拿下东南亚市场第一,出口43个国家,拥有250万用户--你可能不知道,这是一家成立仅一年半.出海仅7个月的中国企业交出的答卷. 这家企业就是中国第一大电子烟品牌RELX悦 ...

  9. 干了这杯Java,让你的Idea比eclipse好用

    1.Idea基本配置 1.1 Idea简介 Idea是一个专门针对Java的集成开发工具(IDE),由Java语言编写.所以,需要有JRE运行环境并配置好环境变量.简单的说,Idea是写代码用的工具. ...

  10. Java环境配置与编译运行详解

    这篇文章主要为大家详细介绍了Java环境配置与编译运行的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.开篇 通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印 ...