Scrapy - 等待Splash完成?

时间:2017-07-19 00:38:42

标签: python 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')

我想这与在后台运行的线程有关 - 但是想知道在进入下一个代码之前是否有办法检查函数是否已完成?例如,Print之前的某种if语句(' FINISH')?

1 个答案:

答案 0 :(得分:0)

Scrapy使用异步代码(即请求被独立处理),因此恕我直言,没有简单的方法来实现这一点。您只能判断一个单独的请求是否已完成,是否在>>> def foo(): ... for i in range(5): ... yield i ... print 'Finished' >>> >>> [x for x in foo()] Finished [0, 1, 2, 3, 4] 方法中进行(如果处理时没有错误)。

另外,作为旁注,在您的示例中,只要考虑生成器的工作方式,在 RUNNING 之后就不会打印 FINISHED 。看看最简单的例子:

function palindrome(str) {

  var st='';    
  st=str.replace(/[^a-z0-9]/ig,"").toLowerCase();    
  var arr=[];    
  arr=st.split('');    
  arr=arr.reverse();    
  var strr='';    
  strr=arr.join('');
  if(strr==st) {
     return true;
 }
 return false;
}    
palindrome("A man, a plan, a canal. Panama");//calling the function