Feed exports

版本0.10中的新功能.

实施抓取工具时最常需要的功能之一就是能够正确存储抓取的数据,并且这通常意味着生成带有抓取数据的"导出文件"(通常称为"导出提要"),以供其他系统使用.

Scrapy通过Feed导出功能提供了开箱即用的功能,它允许您使用多种序列化格式和存储后端生成包含已抓取项目的Feed.

Serialization formats

要序列化抓取的数据,Feed导出使用Item导出器 . 开箱即用地支持以下格式:

但是您也可以通过FEED_EXPORTERS设置扩展支持的格式.

JSON

JSON lines

CSV

  • FEED_FORMAT: csv
  • 使用的导出器: CsvItemExporter
  • 要指定要导出的列及其顺序,请使用FEED_EXPORT_FIELDS . 其他供稿导出器也可以使用此选项,但是对于CSV来说很重要,因为与许多其他导出格式不同,CSV使用固定的标头.

XML

Pickle

Marshal

Storages

使用提要导出时,您可以使用URI (通过FEED_URI设置)定义将提要存储在FEED_URI . 提要导出支持URI方案定义的多种存储后端类型.

开箱即用支持的存储后端是:

如果所需的外部库不可用,则某些存储后端可能不可用. 例如,仅当安装了botocoreboto库时,S3后端才可用(Scrapy仅在Python 2上支持boto ).

Storage URI parameters

存储URI还可以包含在创建Feed时被替换的参数. 这些参数是:

  • %(time)s创建提要时被时间戳替换
  • %(name)s被蜘蛛名替换

任何其他命名参数都将被相同名称的spider属性取代. 例如,在创建Feed的那一刻, %(site_id)s将被spider.site_id属性取代.

这里有一些例子来说明:

  • 每个蜘蛛使用一个目录存储在FTP中:
    • ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json
  • 使用每个蜘蛛一个目录存储在S3中:
    • s3://mybucket/scraping/feeds/%(name)s/%(time)s.json

Storage backends

Local filesystem

提要存储在本地文件系统中.

  • URI方案: file
  • URI示例: file:///tmp/export.csv
  • 所需的外部库:无

请注意,对于本地文件系统存储(仅),如果您指定绝对路径(例如/tmp/export.csv ),则可以省略该方案. 不过,这仅适用于Unix系统.

FTP

The feeds are stored in a FTP server.

  • URI方案: ftp
  • URI示例: ftp://user:pass@ftp.example.com/path/to/export.csv
  • 所需的外部库:无

FTP支持两种不同的连接模式: 主动或被动 . Scrapy默认使用被动连接模式. 要改用活动连接模式,请将FEED_STORAGE_FTP_ACTIVE设置设置为True .

S3

提要存储在Amazon S3上 .

  • URI方案: s3
  • URI示例:
    • s3://mybucket/path/to/export.csv
    • s3://aws_key:aws_secret@mybucket/path/to/export.csv
  • 必需的外部库: botocore (Python 2和Python 3)或boto (仅Python 2)

AWS凭证可以作为用户/密码在URI中传递,也可以通过以下设置传递:

您还可以使用以下设置为导出的供稿定义自定义ACL:

Standard output

提要被写入Scrapy流程的标准输出.

  • URI方案: stdout
  • URI示例: stdout:
  • 所需的外部库:无

Settings

这些是用于配置Feed导出的设置:

FEED_URI

Default: None

导出供稿的URI. 有关受支持的URI方案,请参阅存储后端 .

必须启用此设置才能启用Feed导出.

FEED_FORMAT

供稿使用的序列化格式. 有关可能的值,请参见序列化格式 .

FEED_EXPORT_ENCODING

Default: None

供稿使用的编码.

如果未设置或设置为None (默认值),则它将使用UTF-8进行除JSON输出外的所有操作,JSON输出出于历史原因使用安全的数字编码( \uXXXX序列).

如果您也想为JSON使用UTF-8,请使用utf-8 .

FEED_EXPORT_FIELDS

Default: None

要导出的字段列表,可选. 示例: FEED_EXPORT_FIELDS = ["foo", "bar", "baz"] .

使用FEED_EXPORT_FIELDS选项定义要导出的字段及其顺序.

当FEED_EXPORT_FIELDS为空或"无"(默认)时,Scrapy使用在dict或Spider产生的Item子类中定义的字段.

如果导出器需要一组固定的字段( CSV导出格式就是这种情况)并且FEED_EXPORT_FIELDS为空或"无",则Scrapy会尝试从导出的​​数据中推断字段名称-当前,它使用第一项中的字段名称.

FEED_EXPORT_INDENT

Default: 0

用于在每个级别上缩进输出的空间量. 如果FEED_EXPORT_INDENT是一个非负整数,则数组元素和对象成员将以该缩进级别进行漂亮打印. 缩进级别0 (默认值)或负值会将每一项放在新行上. None选择最紧凑的表示形式.

当前仅由JsonItemExporterXmlItemExporter ,即,当您导出到.json.xml .

FEED_STORE_EMPTY

Default: False

是否导出空的提要(即没有项目的提要).

FEED_STORAGES

Default: {}

包含您的项目支持的其他提要存储后端的字典. 密钥是URI方案,值是存储类的路径.

FEED_STORAGE_FTP_ACTIVE

Default: False

在将源导出到FTP服务器时是使用主动连接模式( True )还是改用被动连接模式( False ,默认值).

有关FTP连接模式的信息,请参见主动和被动FTP有什么区别? .

FEED_STORAGE_S3_ACL

Default: '' (empty string)

一个字符串,其中包含您的项目导出到Amazon S3的提要的自定义ACL.

有关可用值的完整列表,请访问Amazon S3文档上的" 罐头ACL"部分.

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_STORAGES None分配给它们的URI方案来禁用任何这些后端. 例如,要禁用内置的FTP存储后端(不替换),请将其放置在settings.py

FEED_STORAGES = {
    'ftp': None,
}

FEED_EXPORTERS

Default: {}

包含您的项目支持的其他导出器的字典. 键是序列化格式,值是Item导出程序类的路径.

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_EXPORTERS为它们的序列化格式分配None来禁用任何这些导出FEED_EXPORTERS . 例如,要禁用内置CSV导出器(不替换),请将其放置在settings.py

FEED_EXPORTERS = {
    'csv': None,
}