2012-07-29 4 views
1

Je dois envoyer un message à mon spider sur les nouvelles tentatives qui ont été émises plus de 1 fois.Scrapy RetryMiddleWare envoyer le signal à spider

Je pensais utiliser un signal et patcher le RetryMiddleWare intégré dans scrapy pour envoyer un tel signal lorsque les conditions sont remplies.

Cela va-t-il fonctionner?

Comment déclencher un signal dans Scrapy?

Je n'ai pas trouvé d'indice sur le net.

Merci

Répondre

2

RetryMiddleware source est ici - jetez un coup d'oeil et sous-classe pour mettre les fonctionnalités nécessaires:

scrapy.contrib.downloadermiddleware.retry.RetryMiddleware 

désactiver ensuite l'original et activer modifié un:

DOWNLOADER_MIDDLEWARES = { 
    'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': None, 
    'middlewares.MyRetryMiddleware': 500, 
} 

Dans votre intergiciel personnalisé, vous pouvez appeler une méthode spider pour effectuer une action, ou émettre un signal personnalisé en utilisant dispatcher (je choisirais la première méthode).

+0

Merci - méthode d'appel est la bonne façon de procéder - je vais le changer. J'ai corrigé RetryMiddleware pour une solution rapide et sale, mais je vais prendre votre solution et utiliser mon modifié. dois-je sous-classer RetryMiddleware et juste prendre la fonction corrigée? – DjangoPy

+0

Je ne comprends pas ce que vous voulez dire par "patché". Sous-classe 'RetryMiddleware' et modifier la méthode' _retry' (je pense). Changer sa logique pour appeler une méthode spécifique de l'araignée quand une certaine condition se produit. – warvariuc

+0

ok, je l'ai. question générale: disons que je veux ignorer une réponse dans la fonction d'analyse - est-ce suffisant pour retourner Aucun ou devrais-je déclencher une exception? J'ai remarqué que Scrapy est resté bloqué sur de tels scénarios pendant quelques secondes. – DjangoPy

Questions connexes