2017-07-19 76 views
0

以下是我的代碼的簡化版本。在運行時,「完成」文本打印「RUNNING」之前很長一段時間:Scrapy - 等待Splash完成?

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') 

我想這事做在後臺運行的線程 - 但不知道是否有任何的方式來檢查,如果函數在移到下一個代碼之前已經完成了嗎?例如,打印之前的某種if語句('FINISH')?

回答

0

Scrapy使用異步代碼(即請求被獨立處理),所以有恕我直言沒有簡單的方法來實現這一點。您只能告訴一個單獨的請求是否已完成,並且發生在parse_result方法中(當然,如果處理沒有錯誤)。

此外,作爲一個側面說明,在你的榜樣,你不會得到FINISHEDRUNNING僅考慮發電機的工作方式後,不斷印刷。看看最簡單的例子:

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