Scrapy学习笔记(5)---Item Loader

来源:互联网 发布:d810调焦软件 编辑:程序博客网 时间:2024/06/06 05:53

Item加载器提供了一种方便的机制来填充已抓取的Item。尽管可以使用自己的字典类API来填充Item,但Item加载器提供了一种更方便的API来从抓取过程中填充它们,自动化一些常见任务,比如在分配数据之前解析原始提取的数据。
换句话说,Item提供了数据的容器,而Item加载器提供了填充该容器的机制。
Item加载器的设计目的是提供一种灵活、高效和简单的机制来扩展和覆盖不同的字段解析规则,无论是通过爬行器,还是源格式(HTML、XML等),而不会成为维护的噩梦。
ItemLoader objects
class scrapy.loader.ItemLoader([item, selector, response, ]**kwargs)
返回一个用于填充给定item的新item加载器。如果没有提供任何item,那么在default_item_class中使用该类自动实例化。
当使用选择器或响应参数实例化时,ItemLoader类提供了使用选择器从web页面中提取数据的方便机制。
get_value(value, *processors, **kwargs):
add_value(field_name, value, *processors, **kwargs):
replace_value(field_name, value, *processors, **kwargs):
get_xpath(xpath, *processors, **kwargs):
get_xpath(xpath, *processors, **kwargs):
replace_xpath(field_name, xpath, *processors, **kwargs):
get_css(css, *processors, **kwargs):
add_css(field_name, css, *processors, **kwargs):
replace_css(field_name, css, *processors, **kwargs):
load_item(): 使用到目前为止收集的数据填充item,并返回它。收集的数据首先通过输出处理程序获得最终值,以便分配给每个item字段。
nested_xpath(xpath):
nested_css(css):
get_collected_values(field_name):
get_output_value(field_name):
get_input_processor(field_name):
get_output_processor(field_name):
ItemLoader实例具有以下属性:
item:
context:
default_item_class:一个Item类(或工厂),用于在构造函数中不给定的情况下实例化Item。
default_input_processor:
default_output_processor:
default_selector_class:
selector:

使用Item加载器来填充Item

要使用一个Item加载器,您必须首先实例化它。
然后,您开始在Item加载器中收集值,通常使用选择器。可以在同一个Item字段中添加多个值;Item加载器将知道如何使用适当的处理函数来“连接”这些值。
最后,当所有数据被收集时,ItemLoader.load item()方法被调用,该方法实际返回使用add_xpath()、add_css()和add_value()来填充的数据。

输入和输出处理器

一个Item加载器每个(Item)字段包含一个输入处理程序和一个输出处理器。输入处理程序在接收到的数据(通过add_xpath()、add_css()或add_value()方法)处理所提取的数据),并将输入处理器的结果收集并保存在ItemLoader中。收集所有数据之后,ItemLoader.load item()方法被调用来填充并获取填充的item对象。这是在调用之前收集的数据时调用输出处理器(并使用输入处理器进行处理)。输出处理器的结果是分配给该项目的最终值。
值得注意的是,处理器只是可调用的对象,这些对象被调用了要解析的数据,并返回一个已解析的值。因此,您可以使用任何函数作为输入或输出处理器。唯一的要求是它们必须接受一个(并且只有一个)位置参数,这将是一个迭代器。
您需要记住的另一件事是,输入处理器返回的值是在内部收集的(在列表中),然后传递给输出处理器,以填充字段。Scrapy带着一些常用的内置处理器来方便使用。
输入处理程序使用_in后缀声明,而输出处理器则使用_out后缀声明。

定义输入处理器和输出处理器
在Item Field元数据中
对于输入和输出处理器,优先顺序如下:
1.ItemLoader特定字段的属性:field_in和field_out。(最高优先级)
2.Field的元数据:input_processor和output_processor键
3.ItemLoader默认的:ItemLoader.default_input_processor()和ItemLoader.default_output_processor()。(最低优先级)

Item Loader 上下文
Item加载器上下文是一种任意键/值的字典,它是在Item加载器中所有输入和输出处理器之间共享的。它可以在声明、实例化或使用Item装载器时传递。它们被用来修改输入/输出处理器的行为。
可以修改Item加载器上下文值的方法:
1.通过修改当前活动的Item加载器上下文(context属性);
2.在Item加载器实例化(Item加载器构造函数的关键字参数存储在Item加载器上下文中);
3.在Item加载器声明中,对于那些支持用Item装载器上下文实例化它们的输入/输出处理器。

嵌套的加载器
nested_xpath(),nested_css()
您可以任意地嵌套加载器,它们可以使用xpath或css选择器。作为一般的指导方针,当它们使您的代码更简单时,使用嵌套的加载器,但是不要过分使用嵌套,否则解析器就会变得难以阅读。

重用和扩展Item加载器
使用内置的处理器
class scrapy.loader.processors.Identity
最简单的处理器,什么都不做。它返回原始值不变。它不接收任何构造函数参数,也不接受装入器上下文。
class scrapy.loader.processors.TakeFirst
从接收到的值返回第一个非null/非空值,因此它通常作为一个输出处理器被用于单值字段。它不接收任何构造函数参数,也不接受装入器上下文。
class scrapy.loader.processors.Join(separator=u’ ‘)
返回与在构造函数中给出的分隔符连接的值,默认为”。它不接受装入器上下文。
class scrapy.loader.processors.Compose(*functions, **default_loader_context)
一种由给定函数构成的处理器。每个函数都可以有选择地接收装入器上下文参数。在构造函数中传递的关键字参数被用作传递给每个函数调用的默认加载器上下文值。然而,传递给函数的最终加载器上下文值被覆盖,当前活动的加载器上下文可以通过itemloader.context()属性访问。
class scrapy.loader.processors.MapCompose(*functions, **default_loader_context)
这个处理器的输入值被迭代,第一个函数被应用到每个元素。这些函数调用的结果(每个元素的一个)被连接起来构造一个新的迭代,然后用于应用第二个函数,等等,直到最后一个函数被应用到目前为止所收集的值列表的每个值为止。最后一个函数的输出值被连接在一起,以产生这个处理器的输出。
每个特定的函数都可以返回一个值或一个值列表,这些值被应用到其他输入值的相同函数返回的值列表中。函数也可以返回None,在这种情况下,该函数的输出将被忽略,以便在链上进一步处理。
class scrapy.loader.processors.SelectJmes(json_path)
使用提供给构造函数的json路径查询值,并返回输出。

原创粉丝点击