2010-11-06 34 views
11

J'ai des problèmes avec un pipeline en ferraille. Mes informations sont en train d'être corrigées des sites de formulaire et la méthode process_item est appelée correctement. Cependant, les méthodes spider_opened et spider_closed ne sont pas appelées.Le pipeline scrapy spider_opened et spider_closed ne s'appellent pas

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) 

Tant les messages de journalisation __init__ et process_item sont displyed dans le journal, mais les messages de journalisation spider_open et spider_close ne sont pas.

Je dois utiliser les méthodes spider_opened et spider_closed car je veux les utiliser pour ouvrir et fermer une connexion à une base de données, mais rien ne s'affiche dans le journal.

Si quelqu'un a suggéré que ce serait très utile.

Répondre

8

Désolé, je l'ai trouvé juste après avoir posté ceci. Vous devez ajouter:

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

en __init__ sinon il ne reçoit jamais le signal d'appeler

+0

Merci pour votre réponse, mais où obtenez-vous la variable 'dispatcher'? Et comment se fait-il que je ne trouve pas cela sur http://doc.scrapy.org/en/latest/topics/item-pipeline.html? :( – wrongusername

+4

Pour que cela fonctionne, vous devez vous assurer que vous importez les éléments suivants: 'from scrapy.xlib.pydispatch import dispatcher' ' from scrapy import signals' – herrherr

4

noms de méthodes appropriées sont open_spider et close_spider, non spider_opened et spider_closed. Il est documenté ici: http://doc.scrapy.org/en/latest/topics/item-pipeline.html#writing-your-own-item-pipeline.

+1

Ceci est incorrect. 'Spider_open' et' spider_closed' sont des signaux et non des méthodes, comme documenté ici http://doc.scrapy.org/en/latest/topics/signals.html?highlight=spider_opened#std:signal-spider_opened et ici http://doc.scrapy.org/en /latest/topics/signals.html?highlight=spider_closed#std:signal-spider_closed –

+1

Il existe des méthodes nommées open_spider et close_spider, mais elles ne sont pas liées à la question –

+1

A droite, mais pourquoi créez-vous des méthodes spider_opened et spider_closed dans votre exemple de pipeline et s'attendre à ce qu'ils soient appelés? Et pourquoi avez-vous besoin de joindre des signaux manuellement s'il existe des méthodes qui sont déjà appelées? –