Feed exports

New in version 0.10.

实现爬虫时最经常提到的需求就是能合适的保存爬取到的数据,或者说,生成一个带有爬取数据的”输出文件”(通常叫做”输出feed”),来供其他系统使用。

Scrapy自带了Feed输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。

序列化方式(Serialization formats)

用于序列化所爬取的数据,feed exports使用Item exporters原生支持这些格式︰

您也可以通过 FEED_EXPORTERS 设置扩展支持的属性。

JSON

JSON lines

CSV

  • FEED_FORMAT: csv
  • Exporter used: CsvItemExporter
  • To specify columns to export and their order use FEED_EXPORT_FIELDS. Other feed exporters can also use this option, but it is important for CSV because unlike many other export formats CSV uses a fixed header.

XML

Pickle

Marshal

  • FEED_FORMAT: marshal
  • 使用的exporter: MarshalItemExporter

存储(Storages)

使用feed输出时您可以通过使用 URI(通过 FEED_URI 设置) 来定义存储端。 feed输出支持URI方式支持的多种存储后端类型。

自带支持的存储后端有:

有些存储后端会因所需的外部库未安装而不可用。 例如,S3只有在 botocoreboto库安装的情况下才可使用(Scrapy只支持Python 2上的boto)。

存储URI参数

存储URI也包含参数。 当feed被创建时这些参数可以被覆盖:

  • %(time)s - 当feed被创建时被timestamp覆盖
  • %(name)s - 被spider的名字覆盖

其他命名的参数会被spider同名的属性所覆盖。 例如, 当feed被创建时, %(site_id)s 将会被 spider.site_id 属性所覆盖。

下面用一些例子来说明:

  • 存储在FTP,每个spider一个目录:
  • 存储在S3,每一个spider一个目录:
    • s3://mybucket/scraping/feeds/%(name)s/%(time)s.json

存储端(Storage backends)

本地文件系统

将feed存储在本地系统。

  • URI scheme: file
  • URI样例: file:///tmp/export.csv
  • 需要的外部依赖库: none

注意: (只有)存储在本地文件系统时,您可以指定一个绝对路径 /tmp/export.csv 并忽略协议(scheme)。 不过这仅仅只能在Unix系统中工作。

FTP

将feed存储在FTP服务器。

  • URI scheme: ftp
  • URI样例: ftp://user:[email protected]/path/to/export.csv
  • 需要的外部依赖库: none

S3

将feed存储在Amazon S3

  • URI scheme: s3
  • URI样例:
    • s3://mybucket/path/to/export.csv
    • s3://aws_key:aws_secret@mybucket/path/to/export.csv
  • 需要的外部库:botocoreboto

您可以通过在URI中传递user/pass来完成AWS认证,或者也可以通过下列的设置来完成:

标准输出

feed输出到Scrapy进程的标准输出。

  • URI scheme: stdout
  • URI样例: stdout:
  • 需要的外部依赖库: none

设定(Settings)

这些是配置feed输出的设定:

FEED_URI

Default: None

输出feed的URI。 支持的URI协议请参见 存储端(Storage backends)

为了启用feed输出,该设定是必须的。

FEED_FORMAT

输出feed的序列化格式。 可用的值请参见 序列化方式(Serialization formats)

FEED_EXPORT_ENCODING

Default: None

The encoding to be used for the feed.

If unset or set to None (default) it uses UTF-8 for everything except JSON output, which uses safe numeric encoding (\uXXXX sequences) for historic reasons.

Default: None

FEED_EXPORT_FIELDS

Default: None

包含项目支持的额外feed存储端的字典。 Example: FEED_EXPORT_FIELDS = ["foo", "bar", "baz"].

使用FEED_EXPORT_FIELDS选项可以定义输出的字段和它们的顺序。

When FEED_EXPORT_FIELDS is empty or None (default), Scrapy uses fields defined in dicts or Item subclasses a spider is yielding.

If an exporter requires a fixed set of fields (this is the case for CSV export format) and FEED_EXPORT_FIELDS is empty or None, then Scrapy tries to infer field names from the exported data - currently it uses field names from the first item.

FEED_STORE_EMPTY

Default: False

是否输出空feed(没有item的feed)。 feeds with no items).

FEED_STORAGES

Default:: {}

包含项目支持的额外输出器(exporter)的字典。 字典的键(key)是URI协议(scheme),值是存储类(storage class)的路径。

FEED_STORAGES_BASE

Default:

{
    '': 'scrapy.extensions.feedexport.FileFeedStorage',
    'file': 'scrapy.extensions.feedexport.FileFeedStorage',
    'stdout': 'scrapy.extensions.feedexport.StdoutFeedStorage',
    's3': 'scrapy.extensions.feedexport.S3FeedStorage',
    'ftp': 'scrapy.extensions.feedexport.FTPFeedStorage',
}

包含Scrapy内置支持的feed存储端的字典。 You can disable any of these backends by assigning None to their URI scheme in FEED_STORAGES. Default:: {}

FEED_STORAGES = {
    'ftp': None,
}

FEED_EXPORTERS

Default: {}

包含项目支持的额外输出器(exporter)的字典。 该字典的键(key)是URI协议(scheme),值是 Item输出器(exporter) 类的路径。

FEED_EXPORTERS_BASE

Default:

{
    'json': 'scrapy.exporters.JsonItemExporter',
    'jsonlines': 'scrapy.exporters.JsonLinesItemExporter',
    'jl': 'scrapy.exporters.JsonLinesItemExporter',
    'csv': 'scrapy.exporters.CsvItemExporter',
    'xml': 'scrapy.exporters.XmlItemExporter',
    'marshal': 'scrapy.exporters.MarshalItemExporter',
    'pickle': 'scrapy.exporters.PickleItemExporter',
}

一个包含Scrapy支持的内置Feed Exporter的字典。You can disable any of these exporters by assigning None to their serialization format in FEED_EXPORTERS. E.g., to disable the built-in CSV exporter (without replacement), place this in your settings.py:

FEED_EXPORTERS = {
    'csv': None,
}