2012-09-01 63 views
10

我正在刮足球網站和蜘蛛(單蜘蛛)從網站的頁面獲取幾種物品:團隊,比賽,俱樂部等。 我想使用CSVItemExporter將這些項目存儲在單獨的csv文件中, teams.csv,matches.csv,clubs.csv等。如何scrapy出口項目分開csv文件每個項目

我不知道什麼是正確的方法來做到這一點。 到目前爲止,我唯一想到的方法是創建我自己的自定義管道,如示例 http://doc.scrapy.org/en/0.14/topics/exporters.html,然後在spider_opened方法中打開所有需要的csv文件,即爲每個csv文件創建csv導出器,並在process_item中將代碼找出「item」參數是什麼類型的項目,然後將其發送給相應的導出器對象。

無論如何,我還沒有找到在scrapy中處理多個csv文件(每個項目類型)的任何示例,所以我很擔心我以一種不適合使用的方式使用它。 (這是我第一次使用Scrapy)。

diomedes

回答

10

你的做法對我來說似乎很好。 Piplines是Scrapy的一個很棒的功能,並且可以爲您的方法提供IMO構建。

您可以創建多個項目(例如SoccerItem,MatchItem)並在您的MultiCSVItemPipeline中通過檢查項目類將每個項目委託給自己的CSV類。

+0

好的,編寫MultiCSVItemPipeline後,我感覺更好:-)。我檢查你建議的物品類,找出物品的位置。我給出了自己的答案,以顯示具有相同問題的任何人的代碼。 – Diomedes

13

我在這裏發佈的代碼,我用來產生一個MultiCSVItemPipeline基於drcolossos上面的答案。

此管道假定所有Item類遵循約定*項(例如TeamItem,EventItem)並創建team.csv,event.csv文件並將所有記錄發送到相應的csv文件。

from scrapy.exporters import CsvItemExporter 
from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 


def item_type(item): 
    return type(item).__name__.replace('Item','').lower() # TeamItem => team 

class MultiCSVItemPipeline(object): 
    SaveTypes = ['team','club','event', 'match'] 
    def __init__(self): 
     dispatcher.connect(self.spider_opened, signal=signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signal=signals.spider_closed) 

    def spider_opened(self, spider): 
     self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ]) 
     self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes]) 
     [e.start_exporting() for e in self.exporters.values()] 

    def spider_closed(self, spider): 
     [e.finish_exporting() for e in self.exporters.values()] 
     [f.close() for f in self.files.values()] 

    def process_item(self, item, spider): 
     what = item_type(item) 
     if what in set(self.SaveTypes): 
      self.exporters[what].export_item(item) 
     return item 
+0

您可以在輸入某些模塊的地方添加代碼嗎? –

相關問題