ItemLoader
1. ItemLoader在spider中的使用——解析作用
from scrapy.loader import ItemLoader
item_loader = ItemLoader(item, response)
item_loader.add_css()
item_loader.add_xpath()
item_loader.add_value()
以上三个add函数默认从解析规则中获取到值后以列表形式加载到item中。
2. ItemLoader在Item中的使用——数据处理作用
from scrapy.loader.processor improt Mapcompose,TakeFirst,Join
……
class CustomItem(scrapy.Item):
# Mapcompose()对象,初始化时可以传入任意多个函数。作为input_processor,MapCompose对象从左至右依次按照传入的函数处理item中的数据。
# 因为item在上面loader的时候传入的是列表存储的数据,所以MapCompose是用传入的每一个函数,都分别处理列表中的每一个元素值。
title = scrapy.Field(input_processor=Mapcompose(func1, func2, ……), output_processor=func)
# TakeFirst对象,获得列表数据第一项。
title = scrpay.Field(input_process=Mapcompose(), output_processor=TakeFirst())
# Join对象,将列表的每一项连接成字符串,参数为连接分隔符,类似str.join()函数。
title = scrapy.Field(output_processor=Join(连接符))
input_processor和output_processor参数都可以设置自定义的处理函数。
3. 自定义ItemLoader——重载设置自定义属性
1) 源码中的属性
class ItemLoader(object):
default_item_class = Item
default_input_processor = Identity()
default_output_processor = Identity()
default_selector_class = Selector
2)源码中的函数
例如重写这两个函数:
# 看源码之后,这个函数应该是output_processor参数相关的处理函数,可以根据需要自定义,下面只是一个例子
def get_output_value(self, field_name, value=' '):
proc = self.get_output_processor(field_name)
proc = wrap_loader_context(proc, self.context)
try:
return proc(value)
except Exception as e:
raise ValueError("Error with output processor: field=%r value=%r error='%s: %s'" % \
(field_name, self._values[field_name], type(e).__name__, str(e)))
# 这个函数就是在spider的parse中使用的itemloader.load_item()函数,这个函数也可以根据需要自定义
def load_item(self, response=None):
if self._values.get('pub_date'):
pub_dates = self._values.get('pub_date')
else:
pub_dates = [' ' for i in self._values.get('title')]
item_values = list(zip(
self._values.get('title', ' '),
map(response.urljoin, self._values.get('url', ' ')),
pub_dates
))
items = list()
for item_value in item_values:
item = NoticeItem()
item['title'] = self.get_output_value(field_name='title', value=item_value[0])
item['url'] = self.get_output_value(field_name='url', value=item_value[1])
item['pub_date'] = self.get_output_value(field_name='pub_date', value=item_value[2])
item['type'] = self.get_output_value(field_name='type', value=self._values.get('type', [' '])[0])
item['college'] = self.get_output_value(field_name='college', value=self._values.get('college', [' '])[0])
items.append(item)
return items
自定义其他函数时,可以在源码中打断点,先搞清楚这个函数在源码中的作用和执行的时机,就可以准确的自定义自己的功能。