Feed exports用于处理数据的存储
Scrapy提供了开箱即用的数据存储格式:
JSON
- 使用的Feed_exports:JsonItemExporter
JSON lines
- 使用Feed_exports: JsonLinesItemExporter
CSV
- 使用Feed_exports: CsvItemExporter
XML
- 使用Feed_exports: XmlItemExporter
通过设置,Scrapy可以自动将数据存储为对应格式,如果存储CSV,需要在FEED_EXPORT_FIELDS中指定存储列的顺序
Feed exports支持某些存储位置开箱即用(即可以直接使用,不需要我们进行转换),存储位置通过在FEED_URI设置中指明(格式为URI)这些存储位置包括:
本地的文件系统
- URI前缀:file
- 举例:file:///tmp/export.csv
FTP
S3,文件存储在Amazon S3
- URI前缀:s3
- 举例:s3://mybucket/path/to/export.csv
- 依赖于botocore库(python2、3)或是boto(python 2)
- AWS验证的用户名和密码可以在URI中指明,或是通过设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY
标准输出,数据输出到控制台
- URI前缀:stdout
- 举例:stdout:
存储位置的URI支持使用占位符,当Feed Exports被创建时,相应的占位符将会被解析:
%(time)s—替换为Feed Exports创建时的时间
%(name)s—替换为spider的名字
任何其他命名参数都会被相同名称的spider属性替换掉,例如:%(site_id)s将会被替换为spider类的site_id属性的置
存储位置URI举例:
存储在FTP:
ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json
存储在S3:
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
feed exports的设置参数:
FEED_URI:export feed数据存储位置的URI
FEED_FORMAT:数据存储的格式
FEED_EXPORT_ENCODING:数据的编码方式,如果不指定,默认为utf-8
FEED_EXPORT_FIELDS:使用FEED_EXPORT_FIELDS选项定义要导出的字段及其顺序,例如:FEED_EXPORT_FIELDS = ["foo", "bar", "baz"],
当FEED_EXPORT_FIELDS为空,Scrapy使用Item或是dicts中定义的字段(文档讲解也不清楚,网上博客也是互抄,这个等以后验证,初步理解是导出全部)
FEED_EXPORT_INDENT:默认值为0,若为正数,每行元素在输出前,会先输出对应的空格数,如果为0或是负数,每一个item都会输出到新的一行,目前只有jsonitemexports和xmlitemexports实现
FEED_STORE_EMPTY:默认值为false,不保存任何item
FEED_STORAGES:默认值为{},项目用于保存数据到指定位置所使用的类,是一个字典,关键字为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_STORAGES对应的URI的值设置为None,可以在自己的项目中禁止使用对应的类存储数据到指定位置,如果我们想禁止数据存储到某个存储位置,可以settings.py中设置下列值:
FEED_STORAGES = {
'ftp': None,
}
FEED_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',
}
通过将FEED_EXPORTERS对应的序列化格式的值设置为None,可以在自己的项目中禁止使用对应的类存储数据到指定位置,如果我们想禁止使用某种序列化格式,可以settings.py中设置下列值:
FEED_EXPORTERS = {
'csv': None,
}
以上是我自己理解的情况,因为没有做代码实验,所以可能会有错误,在后期做完代码实验后会更改错误的部分,红字为不确定的部分