복붙노트

[PYTHON] Scrapy : spider_idle 이벤트 콜백에서 요청을 수동으로 삽입하는 방법은 무엇입니까?

PYTHON

Scrapy : spider_idle 이벤트 콜백에서 요청을 수동으로 삽입하는 방법은 무엇입니까?

나는 거미를 만들었고 spider_idle 이벤트에 메서드를 연결했습니다.

수동으로 요청을 추가하려면 어떻게합니까? 모든 알려진 URL이 파싱되었으므로 구문 분석에서 항목을 반환 할 수 없습니다.이 경우에는 실행되지 않습니다. 새 요청을 생성하는 메서드가 있고 만든 된 요청을 추가하려면 spider_idle 콜백에서 실행하고 싶습니다.

class FooSpider(BaseSpider):
    name = 'foo'

    def __init__(self):
        dispatcher.connect(self.dont_close_me, signals.spider_idle)

    def dont_close_me(self, spider):
        if spider != self:
            return
        # The engine instance will allow me to schedule requests, but
        # how do I get the engine object?
        engine = unknown_get_engine()
        engine.schedule(self.create_request())

        # afterward, ensure we stay alive by raising DontCloseSpider
        raise DontCloseSpider("..I prefer live spiders.")

업데이트 : 나는 아마도 ExecutionEngine 객체가 필요하다고 결정했지만, 크롤러 인스턴스에서 사용할 수는 있지만 스파이더를 가져 오는 방법을 정확히 알지 못합니다.

업데이트 2 : .. 감사합니다. .. 크롤러는 수퍼 클래스의 속성으로 연결되므로 추가 작업없이 self.crawler를 사용할 수 있습니다. >.>

해결법

  1. ==============================

    1.

    class FooSpider(BaseSpider):
        def __init__(self, *args, **kwargs):
            super(FooSpider, self).__init__(*args, **kwargs)
            dispatcher.connect(self.dont_close_me, signals.spider_idle)
    
        def dont_close_me(self, spider):
            if spider != self:
                return
    
            self.crawler.engine.crawl(self.create_request(), spider)
    
            raise DontCloseSpider("..I prefer live spiders.")
    

    업데이트 2016 :

    class FooSpider(BaseSpider):
        yet = False
    
        @classmethod
        def from_crawler(cls, crawler, *args, **kwargs):
            from_crawler = super(FooSpider, cls).from_crawler
            spider = from_crawler(crawler, *args, **kwargs)
            crawler.signals.connect(spider.idle, signal=scrapy.signals.spider_idle)
            return spider
    
        def idle(self):
            if not self.yet:
                self.crawler.engine.crawl(self.create_request(), self)
                self.yet = True
    
  2. from https://stackoverflow.com/questions/16970112/scrapy-how-to-manually-insert-a-request-from-a-spider-idle-event-callback by cc-by-sa and MIT license