Scrapy中使用ItemLoder(二):简易化的提高与理解

查看了许多关于ItemLoder的使用教学贴,整理出一些简单,易懂的使用方法,方便小白如我的童鞋们,能够更好更快的使用到ItemLoder。

第一步ItemLoder的使用步骤。

# ItemLoder在spider.py中使用
# 导入ItemLoder模块
from scrapy.loder import ItemLoder
# 实例化一个loder对象
loder = ItemLoder(item={},response=response)

ItemLoder中的两个属性item,response。item是一个容器对象,可以是字典,也可以是items.py中的item容器对象DemoItem();response属性是包含数据的源代码。

  def demo_item(self, response):
    # print("字段筛选")
    self.response = response
    # 实例化一个Itemloader对象
    demo_loader = ItemLoader(item=Demo2Item(), response=response)
    for key, value in xpath_set.items():
        demo_loader.add_xpath(key, value.get("xpath"), **{"re": value.get("re")})
    yield demo_loader.load_item()

ItemLoder有三种填充数据的方式:add_xpath根据xpath填充;add_css根据css选择器填充;add_value自定义填充。

使用方法:
loder.add_xpath(字段名,对应的xpath规则)
loder.add_css(字段名,对应的css选择器)
loder.add_value(字段名,自定义数据)

同时 也可以添加正则的处理方式**{“re”:正则匹配规则}

填充好数据后需要将数据采集到loder中,对应的方法是: loder.load_item()

注意,load_item() 采集到的数据都是list列表类型的。
根据需求,需要对采集到的数据进行处理。

第二步,采集数据的预处理

在items.py指定需要爬取的字段,也可以对load_item采集到的item字段进行预处理。
title = scrapy.Field()
字段中有两个处理器:输入处理器input_processor=;输出处理器output_processor=。
使用处理器可以对字段进行一些预处理,根据业务需求,可以调用自己写的函数方法,也可以用scrapy自带的处理器方法。
主要理解scrapy自带的处理器方法即可.
常用的自带处理器方法有:
Compose对每个字段列表进行处理,处理完返回给pipelines;
MapCompose对每个字段列表中的每个元素进行处理,类似于map高阶函数的作用,处理完返回给pipelines;
Join() 用于将指定的元素进行拼接,默认是以空格来拼接,可以指定拼接符号,Join(",");
TakeFirst() 作用是返回可迭代对象的第一个非空元素,常用于output_processor=TakeFirst()输出处理器;
Identity()作用是对字段不做任何处理,原样返回,一般没卵用;
Stop_on_none=True 表示遇到空元素是继续还是中断,一般没什么用O(∩_∩)O哈哈~。

自带处理器的方法需要调用:
from scrapy.loader.processors import TakeFirst, MapCompose, Join, Identity
使用方法如下:

# 在items.py文件中
def cleanout_text(value):
    """清洗文本信息"""
    value = "".join(value.split())
    value = re.findall("(.*\S)", value)
    return value


def cleanout_source(value):
    """清洗来源信息"""
    if value != "":
        return value
    else:
        return "无来源"


class Demo2Item(scrapy.Item):
    # define the fields for your item here like:

    # 新闻标题
    title = scrapy.Field(
        input_processor=MapCompose(cleanout_text),
        output_processor=TakeFirst())
    # 新闻内容
    content = scrapy.Field(
        input_processor=MapCompose(cleanout_text, stop_on_none=True))

ItemLoder在特定的条件下比普通的response.xpath好用,由于ItemLoder需要的是固定的参数,返回的也是固定的数据类型,相对于response.xpath的extract_first()和extract()来说更灵活,方便代码的后期维护和检查。
也算是一个性能优化的方式吧。

最后,再多多一句,对于数据的处理还是放在pipelines管道中处理比较好,毕竟items中的预处理局限性太大了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值