0.10
实现爬虫时最经常提到的需求就是能合适的保存爬取到的数据,或者说,生成一个带有爬取数据的"输出文件"(通常叫做"输出feed"),来供其他系统使用。
Scrapy自带了Feed输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。
feed输出使用到了 Item exporters <topics-exporters>
。其自带支持的类型有:
topics-feed-format-json
topics-feed-format-jsonlines
topics-feed-format-csv
topics-feed-format-xml
您也可以通过 FEED_EXPORTERS
设置扩展支持的属性。
FEED_FORMAT
:json
- 使用的exporter:
~scrapy.contrib.exporter.JsonItemExporter
- 大数据量情况下使用JSON请参见
这个警告 <json-with-large-data>
FEED_FORMAT
:jsonlines
- 使用的exporter:
~scrapy.contrib.exporter.JsonLinesItemExporter
FEED_FORMAT
:csv
- 使用的exporter:
~scrapy.contrib.exporter.CsvItemExporter
FEED_FORMAT
:xml
- 使用的exporter:
~scrapy.contrib.exporter.XmlItemExporter
FEED_FORMAT
:pickle
- 使用的exporter:
~scrapy.contrib.exporter.PickleItemExporter
FEED_FORMAT
:marshal
- 使用的exporter:
~scrapy.contrib.exporter.MarshalItemExporter
使用feed输出时您可以通过使用 URI (通过 FEED_URI
设置) 来定义存储端。 feed输出支持URI方式支持的多种存储后端类型。
自带支持的存储后端有:
topics-feed-storage-fs
topics-feed-storage-ftp
topics-feed-storage-s3
(需要 boto)topics-feed-storage-stdout
有些存储后端会因所需的外部库未安装而不可用。例如,S3只有在 boto 库安装的情况下才可使用。
存储URI也包含参数。当feed被创建时这些参数可以被覆盖:
%(time)s
- 当feed被创建时被timestamp覆盖%(name)s
- 被spider的名字覆盖
其他命名的参数会被spider同名的属性所覆盖。例如, 当feed被创建时, %(site_id)s
将会被 spider.site_id
属性所覆盖。
下面用一些例子来说明:
- 存储在FTP,每个spider一个目录:
ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json
- 存储在S3,每一个spider一个目录:
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
将feed存储在本地系统。
- URI scheme:
file
- URI样例:
file:///tmp/export.csv
- 需要的外部依赖库: none
注意: (只有)存储在本地文件系统时,您可以指定一个绝对路径 /tmp/export.csv
并忽略协议(scheme)。不过这仅仅只能在Unix系统中工作。
将feed存储在FTP服务器。
- URI scheme:
ftp
- URI样例:
ftp://user:pass@ftp.example.com/path/to/export.csv
- 需要的外部依赖库: none
将feed存储在 Amazon S3 。
- URI scheme:
s3
- URI样例:
s3://mybucket/path/to/export.csv
s3://aws_key:aws_secret@mybucket/path/to/export.csv
- 需要的外部依赖库: boto
您可以通过在URI中传递user/pass来完成AWS认证,或者也可以通过下列的设置来完成:
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
feed输出到Scrapy进程的标准输出。
- URI scheme:
stdout
- URI样例:
stdout:
- 需要的外部依赖库: none
这些是配置feed输出的设定:
FEED_URI
(必须)FEED_FORMAT
FEED_STORAGES
FEED_EXPORTERS
FEED_STORE_EMPTY
scrapy.contrib.feedexport
FEED_URI
Default: None
输出feed的URI。支持的URI协议请参见 topics-feed-storage-backends
。
为了启用feed输出,该设定是必须的。
FEED_FORMAT
输出feed的序列化格式。可用的值请参见 topics-feed-format
。
FEED_STORE_EMPTY
Default: False
是否输出空feed(没有item的feed)。
FEED_STORAGES
Default:: {}
包含项目支持的额外feed存储端的字典。 字典的键(key)是URI协议(scheme),值是存储类(storage class)的路径。
FEED_STORAGES_BASE
Default:
{
'': 'scrapy.contrib.feedexport.FileFeedStorage',
'file': 'scrapy.contrib.feedexport.FileFeedStorage',
'stdout': 'scrapy.contrib.feedexport.StdoutFeedStorage',
's3': 'scrapy.contrib.feedexport.S3FeedStorage',
'ftp': 'scrapy.contrib.feedexport.FTPFeedStorage',
}
包含Scrapy内置支持的feed存储端的字典。
FEED_EXPORTERS
Default:: {}
包含项目支持的额外输出器(exporter)的字典。 该字典的键(key)是URI协议(scheme),值是 Item输出器(exporter) <topics-exporters>
类的路径。
FEED_EXPORTERS_BASE
Default:
FEED_EXPORTERS_BASE = {
'json': 'scrapy.contrib.exporter.JsonItemExporter',
'jsonlines': 'scrapy.contrib.exporter.JsonLinesItemExporter',
'csv': 'scrapy.contrib.exporter.CsvItemExporter',
'xml': 'scrapy.contrib.exporter.XmlItemExporter',
'marshal': 'scrapy.contrib.exporter.MarshalItemExporter',
}
包含Scrapy内置支持的feed输出器(exporter)的字典。