Записать текстовый файл в конвейер - PullRequest
1 голос
/ 08 марта 2012

У меня есть несколько пауков в одном проекте 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 ]

1 голос
/ 08 марта 2012

Вы уверены, что всегда запускаете obj.spider_opened(...) до obj.process_item(...)? Кажется, это не так, поскольку после первого вызова метода этот атрибут должен был быть добавлен к объекту.

Если всегда нужен первый вызов метода, возможно, имеет смысл переместить его в __init__ или вызвать его оттуда, кстати.

0 голосов
/ 08 марта 2012

спасибо, ребята, я нашел ответ, мне просто нужно дать сигнал, иначе spider_opened никогда не будет вызывать такой метод в методе init . все еще открыт для предложений

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