2012-03-07 23 views
1

私は単一の治療プロジェクトに複数のスパイダーを持っています。パイプラインにテキストファイルを書き込む

スパイダー名とタイムスタンプを持つスパイダーごとに別々の出力テキストファイルを書きたいと思います。

私は__init方法でファイルを作成していたが、今、私はこのようにしようとしている単一のクモを持っていた場合は、他のは一つだけだろうが、upromiseは、2つの出力ファイルを生成します。

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はどこに定義されていますか?このオブジェクトはおそらく 'オブジェクト'以外のものから継承するべきでしょうか? –

+0

@ sr2222ご返信ありがとうございますが、私は非常にごめんなさい、私は多くのgrepをPythonに持っていません、あなたは私に詳細な答えを教えてください。 –

答えて

0

ありがとう、私は答えを見つけました。そうでなければ信号を与える必要があります。spider_openedは、の方法でこのようには決して呼び出しません。提案のためにまだ開いている

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

の前に常にobj.spider_opened(...)を実行していますか?最初のメソッド呼び出しの後で、その属性がオブジェクトに追加されているはずです。

最初のメソッド呼び出しが常に必要な場合は、それを__init__に移動するか、そこから呼び出すことが理にかなっています。

+0

あなたの返事@Eduardo lvanecのおかげで、もし私がこれを__init__に移したら、そこにあるクモの名前にどうやってアクセスできますか? –