物品出口商

一旦你刮了你的项目,你通常想要保留或导出这些项目,以使用其他应用程序中的数据。也就是说,毕竟刮刮整个过程的目的。

为此,Scrapy为不同的输出格式(如XML,CSV或JSON)提供了一个Item Exporters的集合。

使用产品出口商

如果您匆忙,并且只想使用“物品出口商”输出已查看的数据,请参阅Feed导出。否则,如果您想知道Item Exporters如何工作或需要更多自定义功能(未被默认导出覆盖),请继续阅读下面。

为了使用项目导出器,您必须使用其所需的参数实例化它。每个物品出口商都需要不同的参数,因此请在“内置物品出口商”参考中查看每个出口商文档。在您实例化出口商之后,您必须:

1.调用start_exporting()方法,以表示导出过程的开始

2.为要导出的每个项目调用export_item()方法

3.最后调用finish_exporting()来表示导出过程的结束

在这里,您可以看到使用料品出口商将料品导出到不同文件的物料管道,每个蜘蛛有一个:

从刮取进口信号

从scrapy.exporters导入XmlItemExporter

类XmlExportPipeline(object):

def \_\_init \_\_(self):

    self.files = {}



 @classmethod

 def from\_crawler(cls,crawler):

     pipeline = cls()

     crawler.signals.connect(pipeline.spider\_opened,signals.spider\_opened)

     crawler.signals.connect(pipeline.spider\_closed,signals.spider\_closed)

     返回管道



def spider\_opened(self,spider):

    file = open('%s\_products.xml'%spider.name,'w + b')

    self.files \[spider\] =文件

    self.exporter = XmlItemExporter(file)

    self.exporter.start\_exporting()



def spider\_closed(self,spider):

    self.exporter.finish\_exporting()

    file = self.files.pop(spider)

    file.close()



def process\_item(self,item,spider):

    self.exporter.export\_item(项目)

    归还物品

项目字段的序列化

默认情况下,字段值未修改地传递给底层的序列化库,并且将它们如何序列化的决定委托给每个特定的序列化库。

但是,您可以在传递到序列化库之前自定义每个字段值如何序列化。

有两种方法可以自定义字段将如何序列化,这将在下面介绍。

1.在字段中声明一个串行化器

如果您使用Item,您可以在字段元数据中声明一个序列化程序。串行器必须是可以接收值并返回其序列化形式的可调用函数。

例:

进口刮板

def serialize_price(value):

返回'$%s'%str(value)

类产品(scrapy.Item):

name = scrapy.Field()

price = scrapy.Field(serializer = serialize\_price)

覆盖serialize_field()方法

您还可以覆盖serialize_field()方法来自定义您的字段值的导出方式。

确保在您的自定义代码之后调用基类serialize_field()方法。

例:

内置商品出口商参考

以下是与Scrapy捆绑的物品出口商的列表。其中一些包含输出示例,假设您要导出这两个项目:

Item(name ='Color TV',price ='1200')

Item(name ='DVD player',price ='200')

BaseItemExporter

class scrapy.exporters.BaseItemExporter(fields_to_export = None,export_empty_fields = False,encoding ='utf-8',indent = 0)

这是所有物品出口商的(抽象)基础类。它为所有(具体)项目出口商使用的常用功能提供支持,例如定义要导出的字段,是否导出空字段以及要使用的编码。

这些功能可以通过构造函数参数进行配置,该参数填充其各自的实例属性:fields_to_export,export_empty_fields,encoding,indent。

export_item(项目)

导出给定项目。该方法必须在子类中实现。

serialize_field(字段,名称,值)

返回给定字段的序列化值。如果要控制特定字段或值如何序列化/导出,您可以覆盖此方法(在自定义项目出口商中)。

默认情况下,此方法查找在项目字段中声明的序列化程序,并将该序列化程序应用于该值的结果。如果没有找到序列化程序,它将使用编码属性中声明的编码将编码为str的unicode值返回值不变。

参数:

字段(Field对象或空的dict) - 正在序列化的字段。如果正在导出raw dict(不是Item),则字段值是空的。

name(str) - 要序列化的字段的名称

值 - 序列化的值

start_exporting()

表明出口过程的开始。一些出口商可以使用它来生成一些所需的头(例如,XmlItemExporter)。在导出任何项目之前,您必须调用此方法。

finish_exporting()

表明出口过程的结束。一些出口商可以使用它来生成一些所需的页脚(例如,XmlItemExporter)。在您不再需要导出的项目之后,您必须始终调用此方法。

fields_to_export

具有要导出的字段名称的列表,如果要导出所有字段,则为“无”。默认为无。

一些出口商(如CsvItemExporter)尊重此属性中定义的字段的顺序。

一些出口商可能需要fields_to_export列表,以便在蜘蛛返回dicts(而不是Item实例)时正确导出数据。

export_empty_fields

是否在导出的数据中包含空/未填充的项目字段。默认为False。一些出口商(如CsvItemExporter)忽略此属性,并始终导出所有空字段。

dict项目忽略此选项。

编码

将用于编码unicode值的编码。这只会影响unicode值(这些值总是使用此编码序列化为str)。其他值类型不变地传递给特定的序列化库。

缩进

用于缩小每个级别的输出的空间量。默认为0。

indent = None选择最紧凑的表示,所有项目在同一行中没有缩进

缩进<= 0每个项目在自己的行,没有缩进

缩进> 0每个项目在其自己的行,缩进提供的数值

XmlItemExporter

class scrapy.exporters.XmlItemExporter(file,item_element ='item',root_element ='items',** kwargs)

将XML格式的项导出到指定的文件对象。

参数:

file - 用于导出数据的类似文件的对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

root_element(str) - 导出的XML中的根元素的名称。

item_element(str) - 导出的XML中每个item元素的名称。

该构造函数的附加关键字参数传递给BaseItemExporter构造函数。

这个出口商的典型产出是:

<?xml version =“1.0”encoding =“utf-8”?>

<项目>

的<item>

&lt;name&gt;彩色电视&lt;/ name&gt;

&lt;价格&gt; 1200 &lt;/价格&gt;

</项目>

的<item>

&lt;name&gt; DVD播放器&lt;/ name&gt;

&lt;价格&gt; 200 &lt;/价格&gt;

</项目>

</项目>

除非在serialize_field()方法中被覆盖,否则多值字段通过序列化<value>元素中的每个值来导出。这是为了方便,因为多值字段是非常常见的。

例如,项目:

Item(name = ['John','Doe'],age = '23')

将序列化为:

CsvItemExporter

class scrapy.exporters.CsvItemExporter(file,include_headers_line = True,join_multivalued =',',** kwargs)

将CSV格式的项目导出到给定的类似文件的对象。如果fields_to_export属性被设置,它将用于定义CSV列及其顺序。 export_empty_fields属性对此导出器没有影响。

参数:

file - 用于导出数据的类似文件的对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

include_headers_line(str) - 如果启用,则使导出器输出一个标题行,其中的字段名称取自BaseItemExporter.fields_to_export或第一个导出的项目字段。

join_multivalued - 如果找到,将用于加入多值字段的char(或chars)。

这个构造函数的附加关键字参数被传递给BaseItemExporter构造函数,以及csv.writer构造函数的剩余参数,因此您可以使用任何csv.writer构造方法参数自定义此导出器。

这个出口商的典型产出是:

产品,价格

彩色电视,1200

DVD播放机,200

PickleItemExporter

class scrapy.exporters.PickleItemExporter(file,protocol = 0,** kwargs)

将pickle格式的项目导出到给定的类文件对象。

参数:

file - 用于导出数据的类似文件的对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

protocol(int) - 使用的pickle协议。

有关更多信息,请参阅pickle模块文档。

该构造函数的附加关键字参数传递给BaseItemExporter构造函数。

泡菜不是人类可读的格式,因此不提供任何输出示例。

PprintItemExporter

class scrapy.exporters.PprintItemExporter(file,** kwargs)

将相当打印格式的项目导出到指定的文件对象。

参数:file - 用于导出数据的类文件对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

该构造函数的附加关键字参数传递给BaseItemExporter构造函数。

这个出口商的典型产出是:

{'name':'彩色电视','价格':'1200'}

{'name':'DVD player','price':'200'}

较长的行(如果存在)格式相当。

JsonItemExporter

class scrapy.exporters.JsonItemExporter(file,** kwargs)

将JSON格式的项目导出到指定的类文件对象,将所有对象作为对象列表。附加的构造函数参数传递给BaseItemExporter构造函数,以及JSONEncoder构造函数的剩余参数,因此您可以使用任何JSONEncoder构造函数参数自定义此导出器。

参数:file - 用于导出数据的类文件对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

这个出口商的典型产出是:

[{“name”:“彩电”,“价格”:“1200”},

{“name”:“DVD player”,“price”:“200”}]

警告

JSON是非常简单和灵活的序列化格式,但是对于大量的数据来说,它不能很好地扩展,因为JSON解析器(在任何语言中)的增量(也就是流模式)解析不是很好地支持(如果有的话),他们大多数只是在内存中解析整个对象。如果您希望使用更流畅友好格式的JSON的强大功能和简单性,请考虑使用JsonLinesItemExporter,或将多个块中的输出分割。

JsonLinesItemExporter

class scrapy.exporters.JsonLinesItemExporter(file,** kwargs)

将JSON格式的项导出到指定的类文件对象,每行编写一个JSON编码项。附加的构造函数参数传递给BaseItemExporter构造函数,以及JSONEncoder构造函数的剩余参数,因此您可以使用任何JSONEncoder构造函数参数自定义此导出器。

参数:file - 用于导出数据的类文件对象。它的写方法应该接受字节(以二进制模式打开的磁盘文件,io.BytesIO对象等)

这个出口商的典型产出是:

{“name”:“彩电”,“价格”:“1200”}

{“name”:“DVD player”,“price”:“200”}

与JsonItemExporter生成的不同,此导出器生成的格式非常适合串行大量数据。

results matching ""

    No results matching ""