在Scrapy中導出Json和CSV
在Scrapy中的數據可以通過有一些方法生成Json或CSV文件。
第一種方法是使用Feed Exports。您可以通過從命令行設置文件名和所需格式來運行爬蟲並存儲數據。
如果您希望自定義輸出並在爬蟲運行時生成結構化Json或CSV。您可以使用Item Pipeline在管道中設置輸出屬性,而不是從命令行設置。
使用Feed Export導出
您可以使用scrapy crawl myspider命令從命令行運行您的scraper 。如果要創建輸出文件,則必須設置要使用的文件名和擴展名:
scrapy crawl myspider -o data.json
scrapy crawl myspider -o data.csv
scrapy crawl myspider -o data.xml
Scrapy有自己的內置工具來生成json,csv,xml和其他序列化格式。
如果要指定生成的文件的相對路徑或絕對路徑,或者從命令行設置其他屬性,也可以執行此操作:
scrapy crawl reddit -s FEED_URI=/home/user/folder/mydata.csv -s FEED_FORMAT=csv
scrapy crawl reddit -s FEED_URI=mydata.json -s FEED_FORMAT=json
使用Item Pipeline導出
Scrapy Item Pipeline是一種處理數據的通用工具。典型的用法是清理html,驗證已刪除的數據,刪除重複數據並將數據存儲在資料庫中。如果您想要一個方便且可自定義的過程來存儲數據,則可以使用管道。
您需要使用JsonItemExporter:
from scrapy.exporters import JsonItemExporter
class JsonPipeline(object):
def __init __(self):
self.file = open(「books.json」,wb)
self.exporter = JsonItemExporter(self.file,encoding =utf-8,ensure_ascii = False)
self.exporter.start_exporting()
def close_spider(self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item
除了JsonItemExporter,還有CsvItemExporter,它與CSV的工作方式相同,但您必須調用CsvItemExporter:
class CsvPipeline(object):
def __init __(self):
self.file = open(「booksdata.csv」,wb)
self.exporter = CsvItemExporter(self.file,unicode)
self.exporter.start_exporting()
def close_spider( self,spider):
self.exporter.finish_exporting()
self.file.close()
def process_item(self,item,spider):
self.exporter.export_item(item)
return item
請注意,在csv文件中,默認情況下,欄位用「,」(逗號)分隔。如果您的欄位包含帶逗號的文本,這會破壞整個結構,您可能需要創建一個修復此問題的函數:
def create_valid_csv(self, item):
for key, value in item.items():
is_string = (isinstance(value, basestring))
if (is_string and ("," in value.encode(utf-8))):
item[key] = """ + value + """
您必須在導出項目之前調用此函數,以便ItemExporter相應地識別數據中的逗號。
配置settings.py
告訴scrapy你使用的管道非常重要,否則你的管道將不會被調用。
您必須將下面的代碼添加到Scrapy項目中的settings.py中:
ITEM_PIPELINES = {
RedditScraper.pipelines.JsonPipeline:300,
RedditScraper.pipelines.CsvPipeline:500,
}
這些數字的含義是管道執行的優先順序。在此示例中,JsonPipeline將更快執行。並且數字必須在0-1000的範圍內。
關於作者:
****************************************
- 姓名:麥艷濤
- 網名:挖掘機小王子
- Q羣:581465069
****************************************
轉載請註明出處:https://zhuanlan.zhihu.com/p/58944212
推薦閱讀: