文章目錄
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進程的標準輸出。