2013-06-06 10 views
11

Bir örümcek oluşturdum ve spider_idle olayına bir yöntem bağladım.Scrapy: Bir spider_idle olayı geri çağrısından el ile bir istek nasıl eklenir?

El ile bir istek nasıl eklenir? Öğeyi ayrıştırmadan döndüremiyorum - bilinen tüm URL'ler ayrıştırıldığı için bu durumda ayrıştırılamıyor. Yeni istekleri oluşturmak için bir yöntemim var ve oluşturulan istekleri eklemek için spider_idle geri çağrısından çalıştırmak istiyorum.

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

GÜNCELLEME: Ben muhtemelen ExecutionEngine nesneyi ihtiyaç olduğunu tespit ettik, ancak ben tam bir Crawler örneğinden, bir örümcekten though it mevcut olduğunu nasıl bilmiyorum.

UPDATE 2: ..thanks. ..crawler süper sınıfın bir özelliği olarak eklenmiştir, bu yüzden ben de ek çaba harcamadan self.crawler'ı kullanabilirim. >>

cevap

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

Güncelleme 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 
+0

Ugh. Benim süper sınıfımın bir parçası. >.> –

+0

.. Tarayıcıyı sınıfa eklemek için küçük bir uzantı yazmıştım, ancak bu kesinlikle doğru yol. –

+0

Yukarıdaki işlevin ne yaptığını açıklayabilir misiniz? Henüz ne yapamadığını anlamadım. Ayrıca, spider_idle (self) farkını da açıklayabilir misiniz: self.crawler.engine.slot.scheduler.next_request() zam DontCloseSpider –

İlgili konular