scrapy item处理----cooperator和parallel()函数
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()功能见其它文档
要理解的有以下几点:
- coop.coiterate(work)返回的是一个deferred,如果给定的迭代器执行完成或异常,会触发这个deferred的回调;
- 再给这些返回的deferred加上一个包装deferredlist,意为当它们的回调都被触发后会触发deferredlist的回调;
- 对于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()函数的更多相关文章
- 第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
第三百四十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制 用命令创建自动爬虫文件 创建爬虫文件是根据scrap ...
- 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l 查看scrapy创建爬虫文件可用的母版 Available templates: ...
- 第十篇 scrapy item loader机制
在我们执行scrapy爬取字段中,会有大量的和下面的代码,当要爬取的网站多了,要维护起来很麻烦,为解决这类问题,我们可以根据scrapy提供的loader机制 def parse_detail(sel ...
- python的scrapy框架的使用 和xpath的使用 && scrapy中request和response的函数参数 && parse()函数运行机制
这篇博客主要是讲一下scrapy框架的使用,对于糗事百科爬取数据并未去专门处理 最后爬取的数据保存为json格式 一.先说一下pyharm怎么去看一些函数在源码中的代码实现 按着ctrl然后点击函数就 ...
- scrapy item
item item定义了爬取的数据的model item的使用类似于dict 定义 在items.py中,继承scrapy.Item类,字段类型scrapy.Field() 实例化:(假设定义了一个名 ...
- [scrapy]Item Loders
Items Items就是结构化数据的模块,相当于字典,比如定义一个{"title":"","author":""},i ...
- scrapy item pipeline
item pipeline process_item(self, item, spider) #这个是所有pipeline都必须要有的方法在这个方法下再继续编辑具体怎么处理 另可以添加别的方法 ope ...
- 使用sqlalchemy用orm方式写pipeline将scrapy item快速存入 MySQL
传统的使用scrapy爬下来的数据存入mysql,用的是在pipeline里用pymysql存入数据库, 这种方法需要写sql语句,如果item字段数量非常多的 情况下,编写起来会造成很大的麻烦. 我 ...
- Item 17: 理解特殊成员函数的生成规则
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++的官方说法中,特殊成员函数是C++愿意去主动生成的.C++9 ...
随机推荐
- 修改centos history记录数上限
修改/etc/profile [root@ ~]# sed -i 's/^HISTSIZE=1000/HISTSIZE=200/' /etc/profile [root@ ~]# source /et ...
- 用js实现鼠标点击爱心特效
效果如图以下是代码 <script> !function(e, t, a) { function r() { for (var e = 0; e < s.length; e++) s ...
- python项目虚拟环境搭建
一. 虚拟环境搭建目的 一个项目一个环境,防止各个项目互相干扰,项目更加简洁,利于打包.... 二.使用 pip install virtualenv 安装 创建虚拟环境 cd my_project_ ...
- codeforces 1245D(最小生成树)
题面链接:https://codeforces.com/problemset/problem/1245/D 题意大概是给你一些城市的坐标,可以在城市中建立发电站,也可以让某个城市和已经建好发电站的城市 ...
- C++雾中风景番外篇4:GCC升级二三事
最近将手头上负责的项目代码从GCC 4.8.2升级到了GCC 8.2.(终于可以使用C++17了,想想后续的开发也是很美好啊~~)不过这个过程之中也遇到了一些稀奇古怪的问题,在这里做一个简单的记录,希 ...
- servlet3 使用
一 servlet类 @WebServlet() 用于注释servlet类 参数一般直接设置value外部访问名,省略value 参数类型 value 参数的值就是外部 ...
- VIM学习(转)
原文:http://www.cnblogs.com/nerxious/archive/2012/12/21/2827303.html 断断续续的使用VIM也一年了,会的始终都是那么几个命令,效率极低 ...
- Django组件总结
Django组件介绍 分页器的使用 分页器在页面中非常常见,当数据库条数数据过多时,页面一次性显示不好看时,我们可以使用分页器,将数据分几次显示. 1.1 数据库内插入大量数据 Booklist=[] ...
- awk基本介绍
AWK 是一种用于处理文本的编程语言工具.awk经过改进生成的新的版本nawk,gawk,现在默认linux系统下日常使用的是gawk,用命令可以查看正在应用的awk的来源(ls -l /bin/aw ...
- Could not initialize class net.sourceforge.tess4j.TessAPI 解决方法
java.lang.NoClassDefFoundError: Could not initialize classnet.sourceforge.tess4j.TessAPI 主要原因是在Windo ...