Item

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

数据入库

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

  1. from feapder import Item
  2. item = Item()
  3. item.table_name = "spider_data" # 表名
  4. item.title = title
  5. yield item

等价于:

  1. 生成item

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

    1. item = SpiderDataItem()
    2. item.title = title
    3. yield item

Item指纹

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

  1. from feapder import Item
  2. class SpiderDataItem(Item):
  3. __unique_key__ = ["title", "url"] # 指定去重的key为 title、url,最后的指纹为title与url值联合计算的md5
  4. def __init__(self, *args, **kwargs):
  5. # self.id = None
  6. self.title = None
  7. self.url = None
  8. self.crawl_time = None

或可通过如下方式指定__unique_key__

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

或者重写指纹函数

  1. from feapder import Item
  2. class SpiderDataItem(Item):
  3. ...
  4. @property
  5. def fingerprint(self):
  6. return "我是指纹"

入库前对item进行处理

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

  1. from feapder import Item
  2. class SpiderDataItem(Item):
  3. def __init__(self, *args, **kwargs):
  4. # self.id = None
  5. self.title = None
  6. def pre_to_db(self):
  7. """
  8. 入库前的处理
  9. """
  10. self.title = self.title.strip()

更新数据

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

  1. item = SpiderDataItem.to_UpdateItem()

或直接修改继承类

  1. from feapder import Item, UpdateItem
  2. class SpiderDataItem(UpdateItem):
  3. ...

关于UpdateItem使用,详见UpdateItem