items,项目,顾名思义这个组件主要用来转储项目的,是一个转储容器,类似于 Java 里 POJO。
class SampleItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
pass
我们自定的这个 SampleItem,集成了 scrapy 框架中的 Item,来看下他的定义
class DictItem(MutableMapping, BaseItem):
fields = {}
def __init__(self, *args, **kwargs):
self._values = {}
if args or kwargs: # avoid creating dict for most common case
for k, v in six.iteritems(dict(*args, **kwargs)):
self[k] = v
def __getitem__(self, key):
return self._values[key]
def __setitem__(self, key, value):
if key in self.fields:
self._values[key] = value
else:
raise KeyError("%s does not support field: %s" %
(self.__class__.__name__, key))
def __delitem__(self, key):
del self._values[key]
def __getattr__(self, name):
if name in self.fields:
raise AttributeError("Use item[%r] to get field value" % name)
raise AttributeError(name)
def __setattr__(self, name, value):
if not name.startswith('_'):
raise AttributeError("Use item[%r] = %r to set field value" %
(name, value))
super(DictItem, self).__setattr__(name, value)
def __len__(self):
return len(self._values)
def __iter__(self):
return iter(self._values)
__hash__ = BaseItem.__hash__
def keys(self):
return self._values.keys()
def __repr__(self):
return pformat(dict(self))
def copy(self):
return self.__class__(self)
@six.add_metaclass(ItemMeta)
class Item(DictItem):
pass
Item 继承 DictItem,我们查看源码,姑且这样理解,它就是一个实现了字典的这样一个容器。
好了,我们也定义一下我们的容器,比如我们想知道每一篇文章的收藏情况以及评论的参与度,大致了解一下这篇文章是否受欢迎。我们定义一下我们需要的信息
class SampleItem(scrapy.Item):
# define the fields for your item here like:
# 文章标题
title = scrapy.Field()
# 作者
author = scrapy.Field()
# 发布日期
date = scrapy.Field()
# 收藏
collect = scrapy.Field()
# 评论
comment = scrapy.Field()
pass
看来还是很简单的,接下来我们将创建一个 pipeline,来处理持久化我们的数据。