2010-11-06 8 views
11

Sto riscontrando qualche problema con un oleodotto scrapy. Le mie informazioni vengono raschiate dai siti ok e il metodo process_item viene chiamato correttamente. Tuttavia i metodi spider_opened e spider_closed non vengono chiamati.Pipeline scrapy spider_opened e spider_closed non vengono chiamati

class MyPipeline(object): 

    def __init__(self): 
     log.msg("Initializing Pipeline") 
     self.conn = None 
     self.cur = None 

    def spider_opened(self, spider): 
     log.msg("Pipeline.spider_opened called", level=log.DEBUG) 

    def spider_closed(self, spider): 
     log.msg("Pipeline.spider_closed called", level=log.DEBUG) 

    def process_item(self, item, spider): 
     log.msg("Processsing item " + item['title'], level=log.DEBUG) 

Sia i messaggi di registrazione __init__ e process_item sono displyed nel registro, ma i messaggi di registrazione spider_open e spider_close non lo sono.

Ho bisogno di usare i metodi spider_opened e spider_closed perché voglio usarli per aprire e chiudere una connessione a un database, ma non viene visualizzato nulla nel registro per loro.

Se qualcuno ha suggerito che sarebbe molto utile.

risposta

8

Siamo spiacenti, l'ho trovato subito dopo averlo postato. Bisogna aggiungere:

dispatcher.connect(self.spider_opened, signals.spider_opened) 
dispatcher.connect(self.spider_closed, signals.spider_closed) 

in __init__ altrimenti non riceve il segnale di chiamarlo

+0

Grazie per la risposta, ma dove si ottiene la variabile 'dispatcher'? E come mai non riesco a trovarlo in http://doc.scrapy.org/en/latest/topics/item-pipeline.html? :( – wrongusername

+4

Affinché funzioni, è necessario assicurarsi di importare le seguenti cose: 'da scrapy.xlib.pydispatch import dispatcher' ' da segnali di importazione scrapy' – herrherr

4

nomi dei metodi propri sono open_spider e close_spider, non spider_opened e spider_closed. È documentato qui: http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline.

+1

Questo non è corretto. 'Spider_open' e' spider_closed' sono segnali non metodi. Come documentato qui http://doc.scrapy.org/en/latest/topics/signals.html?highlight=spider_opened#std:signal-spider_opened e qui http://doc.scrapy.org/en /latest/topics/signals.html?highlight=spider_closed#std:signal-spider_closed –

+1

Esistono metodi denominati open_spider e close_spider, tuttavia non sono correlati alla domanda: –

+1

Giusto, ma perché crei metodi spider_opened e spider_closed nel tuo esempio di pipeline e aspettarsi che vengano chiamati? E ​​perché è necessario collegare i segnali manualmente se ci sono metodi che sono già stati chiamati? –