2012-01-31 17 views
0

以下のコードが正しいかどうか調べることができますか?クラスはしかし、複数のスパイダーのために複数同時に開いているファイルを追跡しますおそらく不正なスパイダー・ドックのスパイダー/エクスポーターのコード例

ありがとうございます。

class XmlExportPipeline(object): 

    def __init__(self): 
     dispatcher.connect(self.spider_opened, signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 
     self.files = {} 

    def spider_opened(self, spider): 
     file = open('%s_products.xml' % spider.name, 'w+b') 
     self.files[spider] = file 
     self.exporter = XmlItemExporter(file) 
     self.exporter.start_exporting() 

    def spider_closed(self, spider): 
     self.exporter.finish_exporting() 
     file = self.files.pop(spider) 
     file.close() 

    def process_item(self, item, spider): 
     self.exporter.export_item(item) 
     return item 

答えて

1

私はこの質問がscrapy-users groupで尋ねられるべきだと思います。

AFAIK、v0.14 Scrapyは複数のスパイダーを1つのプロセス(related discussion)でサポートしないため、このコードは正常に動作します。啓発的だった

class XmlExportPipeline(object): 

    def __init__(self): 
     dispatcher.connect(self.spider_opened, signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 
     self.files = {} 
     self.exporters = {} 

    def spider_opened(self, spider): 
     file = open('%s_products.xml' % spider.name, 'w+b') 
     self.files[spider] = file 
     self.exporters[spider] = XmlItemExporter(file) 
     self.exporters[spider].start_exporting() 

    def spider_closed(self, spider): 
     self.exporters[spider].finish_exporting() 
     file = self.files.pop(spider) 
     file.close() 

    def process_item(self, item, spider): 
     self.exporters[spider].export_item(item) 
     return item 
+0

おかげで、:そして、複数のスパイダーのための明白な修正はspiderキーでexporters辞書を作ることです – mskel