欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Scrapy 框架翻译】输出文件(Feed exports) 篇

程序员文章站 2022-05-08 16:47:03
...

版本号:Scrapy 2.4

内容介绍

实现爬虫时最经常提到的需求就是能合适的保存爬取到的数据,或者说,生成一个带有爬取数据的“输出文件”(通常叫“输出 feed”),来供其它系统使用。

如果抓取的内容都存储到数据仓库中本章节可以无视。

Scrapy 自带了 Feed 输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。

序列化方式(serialization formats)

feed 输出使用到了 Item exporters。其自带支持的类型有:JSON、JSON Lines、CSV、XML等。

数据类型 输出格式化 Item类型输出
JSON json JsonItemExporter
JSON lines jsonlines JsonLinesItemExporter
CSV csv CsvItemExporter
XML xml XmlItemExporter
Pickle pickle PickleItemExporter
Marshal marshal MarshalItemExporter

数据存储(Storage )

使用 feed 输出时可以通过使用 URL(通过 FEED_URI 设置)来定义存储端。feed 输出支持 URI 方式支持的多种存储后端类型。

自带支持的存储后端有:本地文件系统、FTP、S3(需要 boto)、标注输出。

存储URI参数(Storage URI parameters)

存储 URI 也包含参数。当 feed 被创建时这些参数可以被覆盖:

  • %(time)s - 当 feed 被创建时被 timestamp 覆盖
  • %(name)s - 被 spider 的名字覆盖

其它命名的参数会被 spider 同名的属性所覆盖。例如,当 feed 被创建时,%(site_id)s 将会被 spider.site_id 属性所覆盖。

# 存储在 FTP,每个 spider 一个目录
ftp://user:[email protected].example.com/scraping/feeds/%(name)s/%(time)s.json

# 存储在 S3,每个 spider 一个目录
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json

存储端(Storage backends)

存储类型 系统限制 URI scheme 依赖库 样例
本地文件系统 Unix file - file://tmp/export.csv
FTP - ftp - tp://user:[email protected]/path/to/export.csv
S3 - s3 boto s3://aws_key:[email protected]/path/to/export.csv
谷歌云存储(GCS) - gs - gs://mybucket/path/to/export.csv
标准输出 - stdout - stdout:

设定(settings)

  • FEEDS(强制性)
  • FEED_EXPORT_ENCODING
  • FEED_STORE_EMPTY
  • FEED_EXPORT_FIELDS
  • FEED_EXPORT_INDENT
  • FEED_STORAGES
  • FEED_STORAGE_FTP_ACTIVE
  • FEED_STORAGE_S3_ACL
  • FEED_EXPORTERS
  • FEED_EXPORT_BATCH_ITEM_COUNT

输出(FEEDS)

默认输出字典格式。启用提要导出功能需要此设置。

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

主要参数列表:

版本 参数名称 参数说明
- format 强制序列化值格式
- batch_item_count FEED_EXPORT_BATCH_ITEM_COUNT
2.3.0 encoding FEED_EXPORT_ENCODING,设置json的编码格式
2.3.0 fields FEED_EXPORT_FIELDS,设置输出的字段
2.3.0 indent FEED_EXPORT_INDENT,设置缩进方式
2.3.0 item_export_kwargs dict的输出类别,
2.4.0 overwrite 是否覆盖它(True)或附加到其内容(False)
2.4.0 store_empty FEED_STORE_EMPTY,是否导出空
2.4.0 uri_params FEED_URI_PARAMS,用于设置要应用的参数。

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',
}

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_EXPORT_BATCH_ITEM_COUNT
Scrapy生成多个输出文件,存储到每个输出文件中指定的项目数。