在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 JsonPipelineobject):

def __init __self):
self.file = open(「books.json」,wb
self.exporter = JsonItemExporter(self.fileencoding =utf-8ensure_ascii = False)
self.exporter.start_exporting()

def close_spiderselfspider):
self.exporter.finish_exporting()
self.file.close()

def process_itemselfitemspider):
self.exporter.export_item(item)
return item

除了JsonItemExporter,還有CsvItemExporter,它與CSV的工作方式相同,但您必須調用CsvItemExporter:

class CsvPipelineobject):

def __init __self):
self.file = open(「booksdata.csv」,wb
self.exporter = CsvItemExporterself.fileunicode
self.exporter.start_exporting()

def close_spider selfspider):
self.exporter.finish_exporting()
self.file.close()

def process_itemselfitemspider):
self.exporter.export_itemitem
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.JsonPipeline300
RedditScraper.pipelines.CsvPipeline500
}

這些數字的含義是管道執行的優先順序。在此示例中,JsonPipeline將更快執行。並且數字必須在0-1000的範圍內。

關於作者:

****************************************

  • 姓名:麥艷濤
  • 網名:挖掘機小王子
  • Q羣:581465069

****************************************

轉載請註明出處:zhuanlan.zhihu.com/p/58


推薦閱讀:
相關文章