Scrapy1.5基本概念(八)——Feed exports

本文为译文,原文见地址:https://docs.scrapy.org/en/latest/topics/feed-exports.html

Feed exports

于版本0.10中新增。

在实现Scrapy时,最常用特性之一是能够正确地存储爬取到的数据,这通常意味着生成一个“导出文件”,其中包含了爬取到的数据(通常被称为“到处提要(export feed)”),以供其他系统使用。

Scrapy使用提要导出(Feed Export)来提供这种脱离内存限制的功能,它允许你使用多种序列化格式和存储后端,用已爬取到的数据项生成提要。

序列化格式

为了序列化爬取到的数据,feed exports使用了数据项导出器(Item exporters)。这些格式支持脱离内存进行存储:

  • JSON
  • JSON lines
  • CSV
  • XML

你也可以设置FEED_EXPORTERS的值,来扩展支持的格式。

JSON

  • FEED_FORMAT:Json
  • 导出器:JsonItemExporter
  • 如果是个很大的feed,请参考这里的警告

JSON行

  • FEED_FORMAT:jsonlines
  • 导出器:Jsonlines

CSV

  • FEED_FORMAT:csv
  • 导出器:CsvItemExporter
  • 为了指定导出列和这些列的顺序,可以使用FEED_EXPORT_FIELDS。其他feed exporters也可以使用这个配置,但是这个配置属性对于CVS很重要,因为与其他导出格式不同,CSV需要一个固定的头。

XML

  • FEED_FORMAT:xml
  • 导出器:XmlItemExporter

Pickle

  • FEED_FORMAT:pickle
  • 导出器:PickleItemExporter

Marshal

  • FEED_FORMAT:marshal
  • 导出器:MarshallItemExporter

存储

在使用feed exports时,使用URI(通过FEED_URI设置项)定义存储feed的位置。feed exports导出支持由URI模式定义的多个存储后端类型。

在后端存储时脱离内存的方式有:

  • 本地文件系统
  • FTP
  • S3(需要botocore或者boto
  • 标准输出

存储URI参数

存储的URI也可以包含参数,这些参数在feed被创建时将被替换。这些参数是:

  • %(time)s - 在创建feed时,被时间戳替换
  • %(name)s - 被爬虫的name属性替换

任何其他名称的参数,可以通过与爬虫相同名称的属性所替换。举个例子,在feed被创建的瞬间,$(site_id)s将被spider.site_id属性值所替换。

这里有一些示例来阐述这个事实:

扫描二维码关注公众号,回复: 4781159 查看本文章

存储到后端

本地文件系统

feeds被存储到本地文件系统:

  • URI结构:file
  • 示例URI:file:///tmp/export.csv
  • 需要的外部库:无

注意,对于本地文件系统存储(只存),如果你指定了一个绝对路径,比如/tmp/export.csv,你可以省略结构。这仅能在Unix系统上工作。

FTP

feeds被存储到FTP服务器:

S3

feeds被存储到Amazon S3

  • URI结构:s3
  • 示例UROI:
    • s3://mybucket/path/to/export.csv
    • s3://aws_key:aws_secret@mybucket/path/to/export.csv

AWS验证可以在URI中直接传递user/password,或者也可以在设置项中传递:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY

标准输出

Scrapy进程将feed写到标准输出中:

  • URI结构:stdout
  • 示例URI:stdout:
  • 需要的外部库:无

设置项

这里有一些配置项用来设置feed exports:

  • FEED_URI(命令的)
  • FEED_FORMAT
  • FEED_STORAGES
  • FEED_EXPORTERS
  • FEED_STORE_EMPTY
  • FEED_EXPORT_ENCODING
  • FEED_EXPORT_FIELDS
  • FEED_EXPORT_INDENT

FEED_URI

默认值:None

导出提要的URI。查看存储到后端,来获取支持的URI结构。

启用feed exports,则需要此配置。

FEED_FORMAT

提要的序列化格式。查看序列化格式获取可以设置的值。

FEED_EXPORT_ENCODING

默认值:None

提要的编码。

如果没有设置或者设置为None(默认值),那么除了JSON输出外,其他的默认使用UTF-8格式。出于历史原因,JSON输出使用安全数值编码(\uXXXX序列)。

如果你希望JSON也是UTF-8的编码格式,则强制使用utf-8。

FEED_EXPORT_FIELDS

默认值:None

字段导出的列表,可选的。例如:FEED_EXPORT_FIELDS= [“foo”, “bar”, “baz”]。

使用可选项FEED_EXPORT_FIELDS来定义导出的字段以及这些字段的顺序。

当FEED_EXPORT_FIELDS为空或者None(默认值),Scrapy将使用爬虫yield出来的字典或者Item派生类中的键作为字段名。

如果一个导出器需要一组固定的字段(CSV导出格式需要此特性)并且FEED_EXPORT_FIELDS为空或者None,Scrapy将尝试从导出的数据中获取字段名——默认它将从第一个数据项获取的键作为字段名称。

FEED_EXPORT_INDENT

默认值:0

用于定义每个等级上输出的缩进空格数。如果FEED_EXPORT_INDENT是一个非负整数,元素集合以及其对象成员将被很友好地打印出来。如果是一个0(默认值),或者一个负数,那么将每一个数据项作为一个新行打印出来。None则会选择最紧凑的打印。

当前仅由JsonItemExporter和XmlItemExporter,即当你导出.json或者.xml。

FEED_STORE_EMPTY

默认值:False

是否导出空feed(比如feed没有数据项)。

FEED_SOTRAGES

默认值:{}

包含项目支持的其他提要存储后端的字典。键是URI结构,值是存储类的路径。

FEED_STORAGES_BASE

默认值:

{
    '': '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存储后端。你可以通过在FEED_STORAGES中不为这些后端的URI模式分配任何后端来禁用这些后端。要禁用内置FTP存储后端(不需要替换),请将其放在settings.py中:

FEED_STORAGES = {
	'ftp': None,
}

FEED_EXPORTERS

默认值:{}

包含项目支持的其他导出器的字典。关键字是序列化后的格式,值指向数据项导出器(Item exporters)的类。

FEED_EXPORTERS_BASE

默认值:

{
    '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赋值给它们的序列化格式来禁用任何这些导出器。例如,要禁用内置的CSV导出器(不需要替换),请将其放在你的settings.py中:

FEED_EXPORTERS = {
	'csv': None,
}

猜你喜欢

转载自blog.csdn.net/ReganDu/article/details/85778609