欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-11 23:17:47
...

查看了许多关于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中的预处理局限性太大了。