Feed exports

版本0.10中的新功能.

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

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

Serialization formats

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

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

JSON

JSON lines

CSV

  • FEEDS设置中format键的FEEDScsv

  • 使用的导出器: CsvItemExporter

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

XML

Pickle

Marshal

Storages

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

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

如果所需的外部库不可用,则某些存储后端可能不可用. 例如,仅在安装了botocore库的情况下,S3后端才可用.

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

提要存储在FTP服务器中.

  • URI scheme: 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

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

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

Standard output

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

  • URI方案: stdout

  • URI示例: stdout:

  • 所需的外部库:无

Settings

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

FEEDS

2.1版中的新功能.

Default: {}

一个字典,其中每个键都是提要URI(或pathlib.Path对象),每个值都是一个嵌套的字典,其中包含特定提要的配置参数. 要启用Feed导出功能,此设置是必需的.

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

例如:

{
    'items.json': {
        'format': 'json',
        'encoding': 'utf8',
        'store_empty': False,
        'fields': None,
        'indent': 4,
    },
    '/home/user/documents/items.xml': {
        'format': 'xml',
        'fields': ['name', 'price'],
        'encoding': 'latin1',
        'indent': 8,
    },
    pathlib.Path('items.csv'): {
        'format': 'csv',
        'fields': ['price', 'name'],
    },
}

以下是可接受的键和设置的列表,如果没有为特定的提要定义提供该键,则该设置将用作备用值.

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

默认值: '' (空字符串)

A string containing a custom ACL for feeds exported to Amazon S3 by your project.

有关可用值的完整列表,请访问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,
}