将文本文件写入管道

问题描述:

我在单个scrapy项目中有多个蜘蛛。将文本文件写入管道

我想为蜘蛛名称和时间戳为每个蜘蛛编写一个单独的输出文本文件。

当我有一个单一的蜘蛛,我在__init方法创建的文件,但现在我想是这样,的Upromise将产生两个输出文件,而另一个则只有一个。

class MallCrawlerPipeline(object): 

def spider_opened(self, spider): 
    self.aWriter = csv.writer(open('../%s_%s.txt' % (spider.name, datetime.now().strftime("%Y%m%d_%H%M%S")), 'wb'), 
     delimiter=',', quoting=csv.QUOTE_MINIMAL) 
    self.aWriter.writerow(['mall', 'store', 'bonus', 'per_action', 'more_than','up_to', 'deal_url', 'category']) 

    if 'upromise' in spider.name: 
     self.cWriter = csv.writer(
      open('../%s_coupons_%s.txt' % (spider.name, datetime.now().strftime("%Y%m%d_%H%M%S")), 'wb'), 
      delimiter=',', quoting=csv.QUOTE_MINIMAL) 
     self.cWriter.writerow(['mall', 'store', 'bonus', 'per_action', 'more_than','up_to', 'deal_url', 'category']) 

def process_item(self, item, spider): 
    self.aWriter.writerow([item['mall'], item['store'], item['bonus'], item['per_action'], 
          item['more_than'], item['up_to'], item['deal_url'], item['category']]) 

    return item 

但我面对这个错误:

File "C:\Users\akhter\Dropbox\akhter\mall_crawler\mall_crawler\pipelines.py", line 24, in process_item 
    self.aWriter.writerow([item['mall'], item['store'], item['bonus'], item['per_action'], 
exceptions.AttributeError: 'MallCrawlerPipeline' object has no attribute 'aWriter' 

任何帮助,将不胜感激。提前致谢。

+1

哪里定义了aWriter?这个对象是否应该从'object'以外的东西继承? – 2012-03-07 20:42:31

+0

@ sr2222感谢您的回复,但是,我非常抱歉,我没有太多的Python蟒蛇,请你给我一个详细的答案。 – 2012-03-08 07:00:55

感谢球员我发现了一个答案,我只需要给一个信号,否则spider_opened永远不会像这样调用init方法。仍然欢迎提供建议

def __init__(self): 
    dispatcher.connect(self.spider_opened, signals.spider_opened) 

您确定您始终在obj.process_item(...)之前运行obj.spider_opened(...)?看起来你不是,就像在第一个方法调用之后那个属性应该被添加到对象中一样。

顺便说一句,如果总是需要第一个方法调用,将它移动到__init__或从那里调用它是有意义的。

+0

感谢您的回复@Eduardo lvanec,如果我将其移至__init__,我如何访问那里的蜘蛛名称? – 2012-03-08 07:02:36