參考:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports
整體架構圖:
SPIDER提取出的數據是dict,從上圖可以看出,會將這些數據發送給ENGINE,然後ENGINE再將數據交給ITEM PIPELINES。
Serialization formats
Scrapy提供了幾種內置的方法,能將dict轉換成常見的數據格式,開箱即用。
- JSON
- JSON Line
- CSV
- XML
以上是Scrapy內置的序列化dict的方法,開發者也可以通過設置FEED_EXPORTERS進行自定義擴展,稍後展開,這個東西就是設置一個開發者自己實現的一個EXPORTER。
Storages
格式轉換有了,接下來就是把轉換好的數據存放在什麼地方的問題。Scrapy通過設置一個URI指定,參數是FEED_URL,稍後展開。
Scrapy支持的內置存儲後端類型:
- Local Filesystem
- FTP
- S3
- Standard Output
有些存儲後端需要另外安裝依賴包,如S3需要安裝botocore與boto。
Storage URI parameters
設置存儲後端的URI可以包含可替換點位符,當真正寫數據時會發生替換:
- (%time)s:用時間戳替換
- (%name)s:用SPIDER的name屬性替換
除了以上兩個外,還可以在URI中指定SPIDER類的屬性名,運行時則用此屬性的值替換。如:
(%site_id)s:運行時會被SPIDER中的屬性site_id的值替換。
很明顯的是可以在SPIDER中操作屬性的變化,進而控制數據最終輸出到那個URI中。
示例:
ftp://user:[email protected]/scraping/feeds/%(name)s/%(time)s.json
s3://mybucket/scraping/feeds/%(name)s/%(time)s.json
Storage backends
本地文件系統很簡單,指定一個指向本地的URI就可以,最多加上前邊介紹的參數,如:
file:///tmp/export.csv 這個是windows,或者:
/tmp/export.csv 這個是unix。
S3沒用過。
標準輸出設置成stdout:就行了。
Settings
涉及到的配置項:
FEED_URI
Default: None
就是前邊說的URI,必需設置。
FEED_FORMAT
前邊說的四種格式之一。
FEED_EXPORT_ENCODING
Default: None
採用的字符集
FEED_EXPORT_FIELDS
Default: None
對SPIDER抓取到的dict數據進行過濾與字段排序。
FEED_EXPORT_INDENT
Default: 0
JSON與XML格式中的縮進
FEED_STORE_EMPTY
Default: False
是否展出空數據
FEED_STORAGES
Default: {}
用戶自定義的後端存儲驅動。
FEED_STORAGE_FTP_ACTIVE
Default: False
FTP的兩種模式。
FEED_STORAGE_S3_ACL
Default: ''
(empty string)
與S3有關。
FEED_STORAGES_BASE
Default:
{ '': 'scrapy.extensions.feedexport.FileFeedStorage', 'file': 'scrapy.extensions.feedexport.FileFeedStorage', 'stdout': 'scrapy.extensions.feedexport.StdoutFeedStorage', 's3': 'scrapy.extensions.feedexport.S3FeedStorage', 'ftp': 'scrapy.extensions.feedexport.FTPFeedStorage', } 這些應該是各種後端存儲的驅動,把後邊的值設定成None就禁用,例如:
FEED_STORAGES = { 'ftp': None, }
在setting.py中設定,禁用的話可能會提高程序的運行效率。
FEED_EXPORTERS
Default: {}
應該是用戶自定義的EXPORTERS,自已實現數據轉換。
FEED_EXPORTERS_BASE
Default:
{ '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', }
Scrapy支持的EXPORTERS,可以禁用,如:
FEED_EXPORTERS = { 'csv': None, }