文章目录
1. 前言
在实现scraper时,常需要的功能之一是能够正确地存储被抓取的数据,这意味着用被抓取的数据(通常称为“导出提要”)生成一个“导出文件”,供其他系统使用。
Scrapy通过Feed导出
提供了这样一个开箱即用的功能。允许你根据抓取的items使用多种序列化格式和存储后端生成feeds。
2. 序列化格式
为了序列化抓取到的数据,feed导出需要使用Item exporters。开箱即用地支持如下几种格式:
- JSON。
- JSON lines。
- CSV。
- XML。
当然,也可以通过FEED_EXPORTERS设置自己想要的格式。
2.1 JSON
- FEEDs设置中的format键的值为:json
- 使用的Exporter:JsonItemExporter
- feed较大时使用JSON lines更好。
2.2 JSON lines
- FEEDs设置中的format键的值为:jsonlines
- 使用的Exporter:JsonLinesItemExporter
2.3 CSV
- FEEDs设置中的format键的值为:csv
- 使用的Exporter:CsvItemExporter
- 使用FEED_EXPORT_FIELDS指明要导出的列和列的顺序。CSV必设此项,因为它根其它格式不太一样,它的列头是固定的。
2.4 XML
- FEEDs设置中的format键的值为:xml
- 使用的Exporter:XmlItemExporter
2.5 Pickle
- FEEDs设置中的format键的值为:pickle
- 使用的Exporter:PickleItemExporter
2.6 Marshal
- FEEDs设置中的format键的值为:marshal
- 使用的Exporter:MarshalItemExporter
3. 存储
当你要使用feed导出时,你可以在FEEDS设置中定义一个或多个URI。feed导出支持多种存储后端类型,都通过URI来定义。
开箱即用地支持如下几种:
- 本地文件系统(Local filesystem)
- FTP
- S3(需要 botocore)
- 标准输出(Standard output)
如果所需的外部库不可用,则某些存储后端可能不可用。例如,只有在 botocore 库已安装情况下,S3后端才可用。
3.1 存储的URI参数
在URI中可以有很多参数。
- %(time)%。创建feed的时间戳。
- %(name)%。spider的name。
也可将sider的其他属性作为URI的参数。当feed创建时,URI中的参数会被实际的值替换。
例子,
- 存储在FTP中( 每一个spider一个目录)。
ftp://user:[email protected]/scraping/feeds/%(name)s/%(time)s.json
- 存储在S3中( 每一个spider一个目录)。
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
3.2 本地文件系统
feed存储在本地文件系统。
- URI语法:file
- URI示例:file:///tmp/export.csv
- 是否需要额外的库:否
请注意,对于本地文件系统存储,如果指定了/tmp/export.csv之类的绝对路径,则可以省略该方案。 不过,这仅适用于Unix系统。
3.3 FTP
feed存储在FTP服务器。
- URI语法:ftp
- URI示例:ftp://user:pass#ftp.example.com/path/to/export.csv
- 是否需要额外的库:否
FTP支持两种连接模式:主动和被动。Scrapy默认使用被动连接模式。将FEED+STORAGE_FTP_ACTIVE设为True,则使用主动连接模式。
3.4 S3
feed存储在Amazon S3。
- URI语法:s3
- URI示例:
-
- s3://mybucket/path/to/export.csv
-
- s3://aws_key:aws_secret@mybucket/path/to/export.csv。需要设置AWS证书。
- 是否需要额外的库:botocore。
3.5 标准输出
feed被写入Scrapy进程的标准输出。