Item Exporters

抓取项目后,您通常希望保留或导出这些项目,以在其他应用程序中使用数据. 毕竟,这就是刮涂过程的整个目的.

为此,Scrapy提供了针对不同输出格式(例如XML,CSV或JSON)的项目导出器的集合.

Using Item Exporters

如果您赶时间,并且只想使用Item Exporter输出抓取的数据,请参阅Feed导出 . 否则,如果您想了解项目导出器的工作方式或需要更多自定义功能(默认导出未涵盖),请继续阅读以下内容.

为了使用Item Exporter,必须使用其必需的arg实例化它. 每个Item Exporter需要不同的参数,因此请确保检查每个Exporter文档,请参阅" 内置Item Exporters参考" . 实例化导出程序后,您必须:

1.调用方法start_exporting()以便发出导出过程的信号

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

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

在这里,您可以看到一个物料管道 ,该管道使用多个物料导出器根据其字段之一的值将已刮取的物料分组到不同的文件中:

from scrapy.exporters import XmlItemExporter

class PerYearXmlExportPipeline(object):
    """Distribute items across multiple XML files according to their 'year' field"""

    def open_spider(self, spider):
        self.year_to_exporter = {}

    def close_spider(self, spider):
        for exporter in self.year_to_exporter.values():
            exporter.finish_exporting()

    def _exporter_for_item(self, item):
        year = item['year']
        if year not in self.year_to_exporter:
            f = open('{}.xml'.format(year), 'wb')
            exporter = XmlItemExporter(f)
            exporter.start_exporting()
            self.year_to_exporter[year] = exporter
        return self.year_to_exporter[year]

    def process_item(self, item, spider):
        exporter = self._exporter_for_item(item)
        exporter.export_item(item)
        return item

Serialization of item fields

默认情况下,字段值未经修改地传递到基础序列化库,并且如何序列化它们的决定委托给每个特定的序列化库.

但是,您可以自定义在将每个字段值传递到序列化库之前如何对其进行序列化 .

有两种方法可以自定义字段的序列化方式,下面介绍.

1. Declaring a serializer in the field

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

Example:

import scrapy

def serialize_price(value):
    return '$ %s' % str(value)

class Product(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field(serializer=serialize_price)

2. Overriding the serialize_field() method

您还可以覆盖serialize_field()方法以自定义如何导出字段值.

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

Example:

from scrapy.exporter import XmlItemExporter

class ProductXmlExporter(XmlItemExporter):

    def serialize_field(self, field, name, value):
        if field == 'price':
            return '$ %s' % str(value)
        return super(Product, self).serialize_field(field, name, value)

Built-in Item Exporters reference

这是与Scrapy捆绑在一起的Item Exporters的列表. 其中一些包含输出示例,这些示例假定您要导出以下两项:

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_exportexport_empty_fieldsencodingindent .

export_item(item)

导出给定的项目. 此方法必须在子类中实现.

serialize_field(field, name, value)

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

默认情况下,此方法查找在item字段中声明的序列化器并返回将该序列化器应用于该值的结果. 如果未找到序列化程序,则它将返回不变的值, unicode值除外,这些值是使用encoding属性中声明的encoding编码为str的.

Parameters:
  • fieldField对象或空dict)–要序列化的字段. 如果要导出原始字典(不是Item ),则字段值为空字典.
  • namestr )–要序列化的字段的名称
  • –要序列化的值
start_exporting()

发出出口过程开始的信号. 一些导出器可能会使用它生成一些必需的标头(例如XmlItemExporter ). 您必须在导出任何项目之前调用此方法.

finish_exporting()

发出导出过程结束的信号. 一些导出器可能会使用它生成一些所需的页脚(例如XmlItemExporter ). 没有更多要导出的项目后,必须始终调用此方法.

fields_to_export

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

一些导出器(例如CsvItemExporter )遵守此属性中定义的字段的顺序.

某些导出程序可能需要fields_to_export列表,以便在蜘蛛返回命令(而非Item实例)时正确导出数据.

export_empty_fields

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

字典项目将忽略此选项.

encoding

将用于编码unicode值的编码. 这仅影响unicode值(使用此编码始终将其序列化为str). 其他值类型将原样传递给特定的序列化库.

indent

用于在每个级别上缩进输出的空间量. 默认为0 .

  • indent=None选择最紧凑的表示形式,同一行中的所有项目都没有缩进
  • indent<=0每个项目单独一行,没有缩进
  • indent>0 each item on its own line, indented with the provided numeric value

PythonItemExporter

class scrapy.exporters.PythonItemExporter(**kwargs)

这是项导出器的基类,该类扩展了BaseItemExporter并支持嵌套项.

它将项目序列化为内置的Python类型,以便可以在其之上使用任何序列化库(例如jsonmsgpack ).

XmlItemExporter

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

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

Parameters:
  • 文件 –用于导出数据的类似文件的对象. 其write方法应接受bytes (以二进制模式打开的磁盘文件, io.BytesIO对象等).
  • root_elementstr )–导出的XML中的根元素的名称.
  • item_elementstr )–导出的XML中每个item元素的名称.

此构造函数的其他关键字参数传递给BaseItemExporter构造函数.

该出口商的典型输出为:

<?xml version="1.0" encoding="utf-8"?>
<items>
  <item>
    <name>Color TV</name>
    <price>1200</price>
 </item>
  <item>
    <name>DVD player</name>
    <price>200</price>
 </item>
</items>

除非在serialize_field()方法中重写,否则通过对<value>元素内的每个值进行序列化来导出多值字段. 这是为了方便起见,因为多值字段非常常见.

例如,项目:

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

将序列化为:

<?xml version="1.0" encoding="utf-8"?>
<items>
  <item>
    <name>
      <value>John</value>
      <value>Doe</value>
    </name>
    <age>23</age>
  </item>
</items>

CsvItemExporter

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

将CSV格式的项目导出到给定的类似文件的对象. 如果设置了fields_to_export属性,它将用于定义CSV列及其顺序. export_empty_fields属性对此出口商无效.

Parameters:
  • 文件 –用于导出数据的类似文件的对象. 其write方法应接受bytes (以二进制模式打开的磁盘文件, io.BytesIO对象等).
  • include_headers_linestr )–如果启用,则使导出器输出标题行,其标题名称取自BaseItemExporter.fields_to_export或第一个导出的项目字段.
  • join_multivalued –将用于连接多值字段的一个或多个char(如果找到).

此构造函数的其他关键字参数将传递给BaseItemExporter构造函数,而剩余的参数传递给csv.writer构造函数,因此您可以使用任何csv.writer构造函数参数来自定义此导出器.

该出口商的典型输出为:

product,price
Color TV,1200
DVD player,200

PickleItemExporter

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

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

Parameters:
  • 文件 –用于导出数据的类似文件的对象. 其write方法应接受bytes (以二进制模式打开的磁盘文件, io.BytesIO对象等).
  • protocolint )–要使用的pickle协议.

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

此构造函数的其他关键字参数传递给BaseItemExporter构造函数.

Pickle不是人类可读的格式,因此没有提供输出示例.

PprintItemExporter

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

以漂亮的打印格式将项目导出到指定的文件对象.

Parameters:file – the file-like object to use for exporting the data. Its write method should accept bytes (a disk file opened in binary mode, a io.BytesIO object, etc)

The additional keyword arguments of this constructor are passed to the BaseItemExporter constructor.

该出口商的典型输出为:

{'name': 'Color TV', 'price': '1200'}
{'name': 'DVD player', 'price': '200'}

较长的行(如果存在)格式正确.

JsonItemExporter

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

将JSON格式的项目导出到指定的类似文件的对象,并将所有对象写为对象列表. 额外的构造函数的参数传递给BaseItemExporter构造函数,剩余的参数给JSONEncoder构造函数,所以你可以使用任何JSONEncoder构造函数的参数来定制这个出口.

Parameters: 文件 –用于导出数据的类似文件的对象. 其write方法应接受bytes (以二进制模式打开的磁盘文件, io.BytesIO对象等).

A typical output of this exporter would be:

[{"name": "Color TV", "price": "1200"},
{"name": "DVD player", "price": "200"}]

Warning

JSON是一种非常简单且灵活的序列化格式,但是对于大量数据而言,它不能很好地扩展,因为JSON解析器(任何语言)都无法很好地支持增量解析(即流模式)解析(如果有的话),并且它们中的大多数只是解析内存中的整个对象. 如果您希望JSON具有强大的功能和简便性,并且具有更易于流传输的格式,请考虑改用JsonLinesItemExporter ,或将输出分成多个块.

JsonLinesItemExporter

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

将JSON格式的项目导出到指定的类似文件的对象,每行写入一个JSON编码的项目. 额外的构造函数的参数传递给BaseItemExporter构造函数,剩余的参数给JSONEncoder构造函数,所以你可以使用任何JSONEncoder构造函数的参数来定制这个出口.

Parameters: 文件 –用于导出数据的类似文件的对象. 其write方法应接受bytes (以二进制模式打开的磁盘文件, io.BytesIO对象等).

该出口商的典型输出为:

{"name": "Color TV", "price": "1200"}
{"name": "DVD player", "price": "200"}

JsonItemExporter产生的格式不同,此导出器产生的格式非常适合于序列化大量数据.

MarshalItemExporter

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

以Python特定的二进制格式导出项目(请参阅marshal ).

Parameters: 文件 –用于导出数据的类似文件的对象. 它的write方法应接受bytes (以二进制模式打开的磁盘文件, BytesIO对象等).