Scrapy: ¿Cómo insertar manualmente una solicitud de una callback de evento spider_idle?

He creado una araña y he vinculado un método al evento spider_idle.

¿Cómo agrego una solicitud manualmente? No puedo devolver el elemento desde el análisis: en este caso, el análisis no se está ejecutando, ya que se analizaron todas las URL conocidas. Tengo un método para generar nuevas solicitudes, y me gustaría ejecutarlo desde la callback spider_idle para agregar las solicitudes creadas.

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.") 

ACTUALIZACIÓN: he determinado que probablemente necesite el objeto ExecutionEngine , pero no sé exactamente cómo obtenerlo de una araña, aunque está disponible desde una instancia del Crawler .

ACTUALIZACIÓN 2: ..gracias. ..crawler se adjunta como una propiedad de la superclase, así que solo puedo usar self.crawler sin ningún esfuerzo adicional. >.>

 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.") 

Actualización 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