feapder/docs/source_code/Item.md

141 lines
2.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Item
有关Item的简介及创建可参考[命令行工具](command/cmdline?id=_3-创建-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
```
1. 使用
```
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入库前的回调函数可通过此函数对数据进行处理
```python
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
```python
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](source_code/UpdateItem)