使用 Exporter 导出数据
在 Scrapy 中,负责导出数据的组件被称为 Exporter(导出器),Scrapy 内部实现了多个 Exporter,每个 Exporter 实现一种数据格式的导出,支持的数据格式如下(括号中为相应的 Exporter):
- JSON (JsonItemExporter)
- JSON lines (JsonLinesItemExporter)
- CSV (CsvItemExporter)
- XML (XmlItemExporter)
- Pickle (PickleItemExporter)
- Marshal (MarshalItemExporter)
其中,前 4 种是极为常用的文本数据格式,而后两种是 Python 特有的。在大多数情况下,使用 Scrapy 内部提供的 Exporter 就足够 了,需要以其他数据格式(上述6种以外)导出数据时,可以自行实现 Exporter。
1. 指定数据导出方法
在导出数据时,需向Scrapy爬虫提供以下信息:导出文件路径和导出数据格式(即选用哪个Exporter)。
可以通过以下两种方式指定爬虫如何导出数据:① 通过命令行参数指定;② 通过配置文件指定。
(1)命令行参数指定数据导出方式
在运行 scrapy crawl
命令时,可以分别使用 -o
和 -t
参数指定导出文件路径以及导出数据格式。 -o
参数我们并不陌生,前面我们已经在多个实例中运用过。使用方式如下:
$ scrapy crawl books -o books.csv
其中,-o books.csv
指定了导出文件的路径,在这里虽然没有使用 -t
参数指定导出数据格式,但 Scrapy 爬虫通过文件后缀名推断出我们想以 CSV 作为导出数据格式。同样的道理,如果将参数改为 -o books.json
,Scrapy 爬虫就会以 json 作为导出数据格式。
需要明确地指定导出数据格式时,使用 -t
参数,例如:
$ scrapy crawl books -t csv -o books1.data
...
$ scrapy crawl books -t json -o books2.data
...
$ scrapy crawl books -t xml -o books3.data
...
运行以上命令后,Scrapy 爬虫会以 -t
参数中的数据格式字符串(如csv、json、xml)为键,在配置字典FEED_EXPORTERS
中搜索 Exporter,FEED_EXPORTERS
的内容由以下两个字典的内容合并而成:
- 默认配置文件中的 FEED_EXPORTERS_BASE
- 用户配置文件中的 FEED_EXPORTERS
前者包含内部支持的导出数据格式,后者包含用户自定义的导出数据格式。以下是 Scrapy 源码中定义的 FEED_EXPORTERS_BASE
,它位于 scrapy.settings.default_settings
模块:
FEED_EXPORTERS_BASE = {
'json': 'scrap