2014-11-18 6 views
1

나는 여러 개의 스파이더를 동시에 실행하기 위해 Scrapy를 사용하는 솔루션을 구현했습니다. 그러나CloseSpider 예외에 응답하지 않는 치료

from scrapy.exceptions import CloseSpider 

class SomeSpider(CrawlSpider): 
    def parse_items(self, response): 
    if self.to_be_killed: 
     raise CloseSpider(reason="Received kill signal") 

코드가 인상 보인다하면서, 다음과 같이 내가 여기 읽은 것을 바탕으로 (http://doc.scrapy.org/en/latest/topics/exceptions.html), 정상적으로는 죽을 시간 거미 신호하기 위해, 나는 CloseSpider 예외를 발생한다 예외를 치는 예외는 오랜 시간 동안 거미가 요청을 처리하고 있습니다. 지금하고있는 일을 즉시 중단해야합니다.

나는 Scrapy가 비동기 프레임 워크를 기반으로 구현된다는 것을 알고 있지만 추가 아웃 바운드 요청을 생성하지 않고 스파이더를 강제 종료 할 수있는 방법이 있습니까?

+0

여러 거미를 실행하는 방법도 붙여 넣을 수 있습니까? 원자로가 정지하는 것을 막기 위해 scrapy [signals] (http://doc.scrapy.org/en/latest/topics/signals.html)를 사용할 수 있습니다. –

답변

5

그래서 해킹 된 솔루션을 사용하여 문제를 해결했습니다. 실제로 Twisted 프레임 워크에서 잘 돌아 가지 않는 방식으로 스파이더를 즉시 종료하는 대신, 필자는 폐쇄 요청한 거미에서 발생하는 요청을 거부하는 DownloaderMiddleware를 작성했습니다. 그래서

:

from scrapy import log 
from scrapy.exceptions import IgnoreRequest 

class SpiderStatusMiddleware: 

    def process_request(self, request, spider): 
     if spider.to_be_killed or not spider.active: 
      log.msg("Spider has been killed, ignoring request to %s" % request.url, log.DEBUG, spider=spider) 
      raise IgnoreRequest() 

     return None 

참고 : to_be_killed 활성은 내 거미 클래스에 정의했고 내 자신의 코드에 의해 관리되는 두 플래그입니다.

+1

이것은 매우 신비스럽고 솔루션이 완벽하게 작동했습니다. 고맙습니다!! –

관련 문제