本文为译文,原文见地址: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模式定义的多个存储后端类型。
在后端存储时脱离内存的方式有:
存储URI参数
存储的URI也可以包含参数,这些参数在feed被创建时将被替换。这些参数是:
- %(time)s - 在创建feed时,被时间戳替换
- %(name)s - 被爬虫的name属性替换
任何其他名称的参数,可以通过与爬虫相同名称的属性所替换。举个例子,在feed被创建的瞬间,$(site_id)s将被spider.site_id属性值所替换。
这里有一些示例来阐述这个事实:
- 在FTP中,每个爬虫使用一个文件夹进行存储:
- 在S3中,每个爬虫使用一个文件夹进行存储:
- s3://mybucket/scraping/feeds/%(name)s/$(time)s.json
存储到后端
本地文件系统
feeds被存储到本地文件系统:
- URI结构:file
- 示例URI:file:///tmp/export.csv
- 需要的外部库:无
注意,对于本地文件系统存储(只存),如果你指定了一个绝对路径,比如/tmp/export.csv,你可以省略结构。这仅能在Unix系统上工作。
FTP
feeds被存储到FTP服务器:
- URI结构:ftp
- 示例URI:ftp://user:[email protected]/path/to/export.csv
- 需要的外部库:无
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,
}