Item Exporters

    为此,Scrapy提供了Item Exporters 来创建不同的输出格式,如XML,CSV或JSON。

    如果你很忙,只想使用 Item Exporter 输出数据,请查看 Feed exports. 相反,如果你想知道Item Exporter 是如何工作的,或需要更多的自定义功能(不包括默认的 exports),请继续阅读下文。

    为了使用 Item Exporter,你必须对 Item Exporter 及其参数 (args) 实例化。每个 Item Exporter 需要不同的参数,详细请查看 。在实例化了 exporter 之后,你必须:

    • 对要导出的每个项目调用 export_item() 方法。
    • 最后调用 表示 exporting 过程的结束
      这里,你可以看到一个 Item Pipeline ,它使用 Item Exporter 导出 items 到不同的文件,每个 spider 一个:

    序列化 item fields


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

    有两种方法可以自定义一个字段如何被序列化,请看下文。

    您可以在 声明一个 serializer。该 serializer 必须可调用,并返回它的序列化形式。

    如果您使用 Item , 您可以在 中声明一个 serializer.该serializer必须为 callable , 并且接受一个值,返回其序列化形式。

    1. import scrapy
    2.  
    3. def serialize_price(value):
    4. return '$ %s' % str(value)
    5.  
    6. class Product(scrapy.Item):
    7. name = scrapy.Field()
    8. price = scrapy.Field(serializer=serialize_price)

    2. 覆盖(overriding) serialize_field() 方法

    你可以覆盖 方法来自定义如何输出你的数据。

    在你的自定义代码后确保你调用父类的 serialize_field() 方法。

    实例:

    1. from scrapy.exporter import XmlItemExporter
    2. class ProductXmlExporter(XmlItemExporter):
    3.  
    4. def serialize_field(self, field, name, value):
    5. if field == 'price':
    6. return '$ %s' % str(value)
    7. return super(Product, self).serialize_field(field, name, value)

    Item Exporters 参考资料

    下面是一些Scrapy内置的 Item Exporters类. 其中一些包括了实例, 假设你要输出以下2个Items:

    BaseItemExporter

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

    这是一个对所有 Item Exporters 的(抽象)父类。它对所有(具体) Item Exporters 提供基本属性,如定义export什么fields, 是否export空fields, 或是否进行编码。

    你可以在构造器中设置它们不同的属性值: fields_to_export ,, encoding.
    exportitem(_item)

    输出给定item. 此方法必须在子类中实现.
    serializefield(_field, name, value)

    返回给定field的序列化值. 你可以覆盖此方法来控制序列化或输出指定的field.

    默认情况下, 此方法寻找一个 serializer 并返回它的值. 如果没有发现 serializer, 则值不会改变,除非你使用 unicode 值并编码到str, 编码可以在 encoding 属性中声明.


    start_exporting()

    表示exporting过程的开始. 一些exporters用于产生需要的头元素(例如XmlItemExporter). 在实现exporting item前必须调用此方法.
    finish_exporting()

    表示exporting过程的结束. 一些exporters用于产生需要的尾元素 (例如XmlItemExporter). 在完成exporting item后必须调用此方法.
    fields_to_export

    列出export什么fields值, None表示export所有fields. 默认值为None.

    一些 exporters (例如 CsvItemExporter) 按照定义在属性中fields的次序依次输出.

    当spider返回dict而不是 Item 的实例(instance)时, 一些export可能需要fields_to_export来正确的导出数据.
    export_empty_fields

    是否在输出数据中包含为空的item fields.默认值是 False. 一些 exporters (例如 CsvItemExporter)会忽略此属性并输出所有fields.

    dict类型的item忽略该选项。
    encoding

    Encoding 属性将用于编码 unicode 值. (仅用于序列化字符串).其他值类型将不变的传递到指定的序列化库.
    class scrapy.exporters.XmlItemExporter(file, item_element='item', root_element='items', **kwargs)

    以XML格式 exports Items 到指定的文件类.

    参数:
    - file – 文件类.
    - root_element (str) – XML 根元素名.
    - item_element (str) – XML item 的元素名.


    构造器额外的关键字参数将传给 构造器.

    一个典型的 exporter 实例:




    1. <?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() 方法, 多个值的 fields 会转化每个值到 <value> 元素.

    例如, item:




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




    将被转化为:







    CsvItemExporter

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

    输出 csv 文件格式. 如果添加 fieldsto_export 属性, 它会按顺序定义CSV的列名. export_empty_fields 属性在此没有作用.



    此构造器额外的关键字参数将传给 BaseItemExporter 构造器 , 其余的将传给 构造器, 以此来定制 exporter.

    一个典型的 exporter 实例:




    1. product,price
      Color TV,1200
      DVD player,200



    PickleItemExporter

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

    输出 pickle 文件格式.

    参数:
    - file – 文件类.
    - protocol (int) – pickle 协议.


    更多信息请看 pickle module documentation.

    此构造器额外的关键字参数将传给 构造器.

    Pickle 不是可读的格式,这里不提供实例.
    class scrapy.exporters.PprintItemExporter(file, **kwargs)

    输出整齐打印的文件格式.



    此构造器额外的关键字参数将传给 构造器.

    一个典型的 exporter 实例:




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




    此格式会根据行的长短进行调整.

    JsonItemExporter

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

    输出 JSON 文件格式, 所有对象将写进一个对象的列表. 此构造器额外的关键字参数将传给 BaseItemExporter 构造器, 其余的将传给 构造器, 以此来定制 exporter.

    参数:file – 文件类.


    一个典型的 exporter 实例:









    警告

    JSON 是一个简单而有弹性的格式, 但对大量数据的扩展性不是很好,因为这里会将整个对象放入内存. 如果你要JSON既强大又简单,可以考虑 JsonLinesItemExporter , 或把输出对象分为多个块.

    JsonLinesItemExporter

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

    输出 JSON 文件格式, 每行写一个 JSON-encoded 项. 此构造器额外的关键字参数将传给 构造器, 其余的将传给 JSONEncoder 构造器, 以此来定制 exporter.



    一个典型的 exporter 实例:




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




    这个类能很好的处理大量数据.