feapder/docs/source_code/Item.md

2.8 KiB
Raw Blame History

Item

有关Item的简介及创建可参考命令行工具

数据入库

数据自动入库除了根据mysql表生产item外也可以直接给item赋值示例如下

from feapder import Item

item = Item()
item.table_name = "spider_data" # 表名
item.title = title
yield item

等价于:

  1. 生成item

    from feapder import Item
    
    class SpiderDataItem(Item):
        """
        This class was generated by feapder.
        command: feapder create -i spider_data.
        """
    
        def __init__(self, *args, **kwargs):
            # self.id = None
            self.title = None
    
  2. 使用

    item = SpiderDataItem()
    item.title = title
    yield item
    

Item指纹

item指纹用于数据入库前的去重默认为所有字段值排序后计算的md5但当数据中有采集时间时这种指纹计算方式明显不合理。因此我们可以通过如下方法指定参与去重的key

from feapder import Item


class SpiderDataItem(Item):
    
    __unique_key__ = ["title", "url"] # 指定去重的key为 title、url最后的指纹为title与url值联合计算的md5

    def __init__(self, *args, **kwargs):
        # self.id = None
        self.title = None
        self.url = None
        self.crawl_time = None

或可通过如下方式指定__unique_key__

item = SpiderDataItem()
item.unique_key =  ["title", "url"] # 支持列表、元组、字符串

或者重写指纹函数

from feapder import Item


class SpiderDataItem(Item):
    ...

    @property
    def fingerprint(self):
        return "我是指纹"

入库前对item进行处理

pre_to_db函数为每个item入库前的回调函数可通过此函数对数据进行处理

from feapder import Item


class SpiderDataItem(Item):

    def __init__(self, *args, **kwargs):
        # self.id = None
        self.title = None

    def pre_to_db(self):
        """
        入库前的处理
        """
        self.title = self.title.strip()

指定入库使用的pipelines


from feapder import Item
from feapder.pipelines.csv_pipeline import CsvPipeline


class SpiderDataItem(Item):

    __pipelines__ = [CsvPipeline()]

    def __init__(self, *args, **kwargs):
        # self.id = None
        self.title = None

使用__pipelines__指定后该item只会流经指定的pipelines处理

更新数据

采集过程中往往会有些数据漏采或解析出错如果我们想更新已入库的数据可将Item转为UpdateItem

item = SpiderDataItem.to_UpdateItem()

或直接修改继承类

from feapder import Item, UpdateItem

class SpiderDataItem(UpdateItem):
    ...

关于UpdateItem使用详见UpdateItem