爬虫Scrapy笔记(二)、items

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,来处理持久化我们的数据。

发表评论

邮箱地址不会被公开。 必填项已用*标注