1、在Item中添加自定义函数
如日期转换函数
# 定义一个时间处理转换函数
# 将 '2022-12-28' 转换成 datetime.date(2022, 12, 28)
def date_convert(value):
try:
create_date = datetime.datetime.strptime(value, "%Y-%m-%d").date()
except Exception as e:
create_date = datetime.datetime.now().date()
return create_date
2、定义item数据项时,配置输入处理器input_processor和输出处理器output_processor,并引入自定义转换函数
class newsItem(scrapy.Item):
# news标题
title = scrapy.Field()
# news发布时间
news_date = scrapy.Field(
input_processor = MapCompose(date_convert),
output_processor = TakeFirst()
)
以上2步骤即可完成item数据项的自定义转换。
说明:TakeFirst() 返回第一个非空(non-null/ non-empty)值,常用于单值字段的输出处理器,无参数
Field 字段参数:
- input_processor(输入处理器),对item数据项字段值传过来时,进行预处理。
- output_processor(输出处理器),对item数据项 输出前的预处理。
item数据的处理过程:
- 第一步, 通过 add_xpath(), add_css() 或者 add_value() 方法),提取到数据。
- 第二步,将提取到的数据,传递到输入处理器(input_processor)中进行处理,处理结果被收集起来,并且保存在ItemLoader内(但尚未分配给该Item)。
- 第三步,最后调用输出处理器(output_processor)来处理之前收集到的数据(这是最后一步对数据的处理)。然后再存入到Item中,输出处理器的结果是被分配到Item的最终值。
- 第四步,收集到所有的数据后, 调用ItemLoader.load_item() 方法来填充,并得到填充后的 Item 对象。
注意事项:input_processor和output_processor都是可调用对象,调用时传入需要被分析的数据,处理后返回分析得到的值。因此你可以使用任意函数作为输入、输出处理器。唯一需注意的是它们必须接收一个(并且只是一个)迭代器性质的参数。