开发环境为 Python3.6,Scrapy 版本 2.4.x ,爬虫项目全部内容索引目录
看懂Python爬虫框架,所见即所得一切皆有可能
本章带你学习基于 Python3 的 Scrapy 爬虫框架 中数据爬取过程中数据输出操作。生成一个带有爬取数据的“输出文件”(通常叫“输出 feed”),来供其它系统使用。
Scrapy 自带了 Feed 输出,并且支持多种序列化格式(serialization format)及存储方式(storage backends)。
如果抓取的内容都存储到数据仓库中本章节可以无视。
代码内容基于「Scrapy 爬虫框架」源码版本 2.4.0 ,更新内容会进行标记说明对应版本。
数据类型 | 输出格式化 | Item 类型输出 |
---|---|---|
JSON | json | JsonItemExporter |
JSON lines | jsonlines | JsonLinesItemExporter |
CSV | csv | CsvItemExporter |
XML | xml | XmlItemExporter |
Pickle | pickle | PickleItemExporter |
Marshal | marshal | MarshalItemExporter |
使用 feed 输出时可以通过使用 URL(通过 FEED_URI 设置)来定义存储端。feed 输出支持 URI 方式支持的多种存储后端类型。
自带支持的存储后端有:本地文件系统、FTP、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
存储类型 | 系统限制 | URI scheme | 依赖库 | 样例 |
---|---|---|---|---|
本地文件系统 | Unix | file | - | file://tmp/export.csv |
FTP | - | ftp | - | tp://user:[email protected]/path/to/export.csv |
S3 | - | s3 | boto | s3://aws_key:aws_secret@mybucket/path/to/export.csv |
谷歌云存储(GCS) | - | gs | - | gs://mybucket/path/to/export.csv |
标准输出 | - | stdout | - | stdout: |
- 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
{
'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生成多个输出文件,存储到每个输出文件中指定的项目数。