Scrapy——ItemLoader

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)源码中的函数

itemloader中的函数
例如重写这两个函数:

# 看源码之后,这个函数应该是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

自定义其他函数时,可以在源码中打断点,先搞清楚这个函数在源码中的作用和执行的时机,就可以准确的自定义自己的功能。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值