實現爬蟲時最經常提到的需求就是能合適的保存爬取到的數據,或者說,生成一個帶有爬取數據的“輸出文件”(通常叫“輸出 feed”),來供其它系統使用。
Scrapy 自帶了 Feed 輸出,並且支持多種序列化格式(serialization format)及存儲方式(storage backends)。
序列化方式(serialization formats)
feed 輸出使用到了 Item exporters。其自帶支持的類型有:
- JSON
- JSON Lines
- CSV
- XML
也可以通過 FEED_EXPORTERS 設置擴展支持的屬性。
JSON
- FEED_FORMAT: json
- 使用的 exporter: JsonItemExporter
- 大數據量情況下使用 JSON 請參見 這個警告
JSON lines
- FEED_FORMAT: jsonlines
- 使用的 exporter: JsonLinesItemExporter
CSV
- FEED_FORMAT: csv
- 使用的 exporter: CsvItemExporter
XML
- FEED_FORMAT: xml
- 使用的 exporter: XmlItemExporter
Pickle
- FEED_FORMAT: pickle
- 使用的 exporter: PickleItemExporter
Marshal
- FEED_FORMAT: marshal
- 使用的 exporter: MarshalItemExporter
存儲(Storages)
使用 feed 輸出時可以通過使用 URL(通過 FEED_URI 設置)來定義存儲端。feed 輸出支持 URI 方式支持的多種存儲后端類型。
自帶支持的存儲后端有:
- 本地文件系統
- FTP
- S3(需要 boto)
- 標注輸出
有些存儲后端會因為所需外部庫未安裝而不可用。例如,S3 只有在 boto 庫安裝的情況下才可用。
存儲 URI 參數
存儲 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
存儲端(Storage backends)
本地文件系統
將 feed 存儲在本地系統。
- URI scheme:file
- URI 樣例:file://tmp/export.csv
- 需要的外部依賴庫:none
注意: (只有)存儲在本地文件系統時,您可以指定一個絕對路徑 /tmp/export.csv 並忽略協議(scheme)。不過這僅僅只能在 Unix 系統中工作。
FTP
將 feed 存儲在 FTP 服務器。
- URI scheme:
ftp
- URI 樣例:
ftp://user:pass@ftp.example.com/path/to/export.csv
- 需要的外部依賴庫:
none
S3
將 feed 存儲在 Amazon S3 。
- URI scheme: s3
- URI 樣例:
- s3://mybucket/path/to/export.csv
- s3://aws_key:aws_secret@mybucket/path/to/export.csv
- 需要的外部依賴庫: boto
您可以通過在 URI 中傳遞 user/pass 來完成 AWS 認證,或者也可以通過下列的設置來完成:
AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY
標准輸出
feed 輸出到 Scrapy 進程的標准輸出。
- URI scheme: stdout
- URI 樣例: stdout:
- 需要的外部依賴庫: none
設定(settings)
這些是配置 feed 輸出的設定:
- FEED_URI (必須)
- FEED_FORMAT
- FEED_STORAGES
- FEED_EXPORTERS
- FEED_STORE_EMPTY
FEED_URI
Default:None
輸出 feed 的 URI。支持的 URI 協議請參見存儲端(Storage backends)
。
為了啟用 feed 輸出,該設定是必須的。
FEED_FORMAT
輸出 feed 的序列化格式。可用的值請參見序列化方式(Serialization formats)
。
FEED_STORE_EMPTY
Default:False
是否輸出空 feed(沒有 item 的 feed)。
FEED_STORAGES
Default::{}
包含項目支持的額外 feed 存儲端的字典。 字典的鍵(key)是 URI 協議(scheme),值是存儲類(storage class)的路徑。
FEED_STORAGES_BASE
Default:
{ '': 'scrapy.contrib.feedexport.FileFeedStorage', 'file': 'scrapy.contrib.feedexport.FileFeedStorage', 'stdout': 'scrapy.contrib.feedexport.StdoutFeedStorage', 's3': 'scrapy.contrib.feedexport.S3FeedStorage', 'ftp': 'scrapy.contrib.feedexport.FTPFeedStorage', }
包含 Scrapy 內置支持的 feed 存儲端的字典。
FEED_EXPORTERS
Default::{}
包含項目支持的額外輸出器(exporter)的字典。 該字典的鍵(key)是 URI 協議(scheme),值是 Item 輸出器(exporter) 類的路徑。
FEED_EXPORTERS_BASE
Default:
FEED_EXPORTERS_BASE = { 'json': 'scrapy.contrib.exporter.JsonItemExporter', 'jsonlines': 'scrapy.contrib.exporter.JsonLinesItemExporter', 'csv': 'scrapy.contrib.exporter.CsvItemExporter', 'xml': 'scrapy.contrib.exporter.XmlItemExporter', 'marshal': 'scrapy.contrib.exporter.MarshalItemExporter', }
包含 Scrpay 內置支持的 feed 輸出器(exporter)的字典。