物品出口商
一旦你刮了你的项目,你通常想要保留或导出这些项目,以使用其他应用程序中的数据。也就是说,毕竟刮刮整个过程的目的。
为此,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>
<name>彩色电视</ name>
<价格> 1200 </价格>
</项目>
的<item>
<name> DVD播放器</ name>
<价格> 200 </价格>
</项目>
</项目>
除非在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生成的不同,此导出器生成的格式非常适合串行大量数据。