2012-09-01 20 views
10

サッカーサイトを掻いていて、スパイダー(単一のスパイダー)がサイトのページからいくつかのアイテムを取得しています:チーム、マッチ、クラブなど CSVItemExporterを使用してこれらのアイテムを個別のCSVファイル( teams.csv、matches.csv、clubs.csvなど)に保存してください。アイテムを1アイテムごとに別々のCSVファイルにエクスポートするにはどうすればいいですか?

これを行う正しい方法はわかりません。 私がこれまで考えてきた唯一の方法は、例のような独自のカスタムパイプラインを作成することです http://doc.scrapy.org/en/0.14/topics/exporters.html spider_openedメソッドに必要なすべてのcsvファイルを開きます。つまり、各csvファイルとprocess_item putコードにcsvエクスポータを作成します。どのような種類の項目が「項目」パラメータであるのか把握し、それを対応する輸出者オブジェクトに送信します。

とにかく私はscrapyの複数のcsvファイル(アイテムタイプごと)を扱う例は見つかっていないので、使用するつもりではない方法で使用していると心配しています。 (これはScrapyの私の最初の経験です)。

ジオメド

答えて

10

あなたは私にはうまくいくようです。 PiplinesはScrapyの素晴らしい機能であり、あなたのアプローチのようなもののためにIMOを構築しています。

複数のアイテム(SoccerItem、MatchItemなど)を作成し、MultiCSVItemPipelineではアイテムクラスを確認して各アイテムを専用のCSVクラスに委任できます。

+0

いいえ、MultiCSVItemPipelineを書いた後、私は気分が良くなります:-)。私はあなたが項目が行く場所を把握するために項目クラスを提案したことを確認します。私は同じ質問をしている人のためのコードを表示するために自己回答をしています。 – Diomedes

13

私は上記のdrcolossosの答えに基づいてMultiCSVItemPipelineを生成するために使用したコードをここに掲載しています。

このパイプラインは、すべてのItemクラスが* 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

いくつかのモジュールをインポートするコードを含めてください。 –