2017-07-19 2 views
0

Ci-dessous est une version simplifiée de mon code. Lors de l'exécution, le texte « FINI » imprime longtemps avant « RUNNING »:Scrapy - attendez que Splash finisse?

import scrapy 
from scrapy_splash import SplashRequest 

class ExtractSpider(scrapy.Spider): 
    name = 'extract' 
    start_urls = ['SomeURL'] 

    def parse(self, response): 

     url_list = response.css('a.title::attr(href)').extract() 
     for url in url_list: 
      splash_args = { 
         'html': 1, 
         'png': 1, 
         'render_all': True, 
         'wait': 0.5 
        } 
      yield SplashRequest(url, self.parse_result, endpoint='render.json', args=splash_args) 
     print('FINISHED') 

    def parse_result(self, response): 
     print('RUNNING') 

Je suppose que cela a quelque chose à voir avec les discussions en cours d'exécution en arrière-plan - mais se demandait s'il y avait un moyen de vérifier si le fonction est terminée avant de passer au code suivant? Par exemple, une sorte d'instruction if avant Print ('FINISH')?

Répondre

0

Scrapy utilise un code asynchrone (c'est-à-dire que les requêtes sont traitées indépendamment), donc il n'y a pas de moyen simple pour y parvenir. Vous pouvez seulement dire si une demande individuelle est terminée et cela se passe dans la méthode parse_result (si elle est traitée sans erreur, bien sûr).

En outre, comme une note de côté, dans votre exemple, vous ne seriez pas obtenir FINI jamais imprimé après RUNNING juste compte tenu de la façon de travailler des générateurs. Regardez l'exemple le plus simple:

>>> def foo(): 
... for i in range(5): 
...  yield i 
... print 'Finished' 
>>> 
>>> [x for x in foo()] 
Finished 
[0, 1, 2, 3, 4]