将文本文件写入管道

时间:2012-03-07 20:14:41

标签: python web-crawler scrapy

我在一个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'

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

谢谢大家,我找到了一个答案,我只需要发出一个信号,否则spider_opened永远不会在 init 方法中调用。仍然愿意接受建议

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