2012-09-12 25 views
27

Örümcek sınıfında, sonlanmadan hemen önce bir yöntem tetiklemenin bir yolu var mı?scrapy: Örümcek kapandığında bir işlev çağırın

class MySpider(CrawlSpider): 
    #Config stuff goes here... 

    def quit(self): 
     #Do some stuff... 
     raise CloseSpider('MySpider is quitting now.') 

    def my_parser(self, response): 
     if termination_condition: 
      self.quit() 

     #Parsing stuff goes here... 

Ama örümcek doğal olarak çıkmak üzereyken nasıl belirleneceği hakkında herhangi bir bilgi bulamıyorum:

böyle, örümcek kendim kesebilirler.

cevap

50

dispatcher aracılığıyla bir sinyal dinleyicisi kaydedebilirsiniz gibi görünüyor.

from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 

class MySpider(CrawlSpider): 
    def __init__(self): 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 

    def spider_closed(self, spider): 
     # second param is instance of spder about to be closed. 
+3

eserler. Ama sinyal adıyla karışıklıktan kaçınmak için MySpider.quit() yöntemini veya benzer bir şeyi adlandırmayı öneririm. Teşekkürler! – Abe

+0

Mükemmel çözüm. Ve evet, örnek tam olarak bir CrawlSpider ile aynı şekilde çalışmalıdır. –

+0

Bu çözüm ayrıca, aşağıda “Css” den bahsettiğine aykırı olarak, Scrapy ** 0.20.0 ** 'da iyi çalışır. – not2qubit

7

Benim için yukarıda işe yaramadı/en azından scrapy 0.19 için modası geçmiş:

ben gibi bir şey denemek istiyorum. o olabilir (

class MySpider(CrawlSpider): 
    def closed(self, reason): 
     do-something() 
26

Hemen güncellemek için: Gerçi aşağıdaki çalışmak lazım ayrıca eski sürümler için de çalışır).

from scrapy import signals 

class MySpider(CrawlSpider): 
    name = 'myspider' 

    @classmethod 
    def from_crawler(cls, crawler, *args, **kwargs): 
     spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs) 
     crawler.signals.connect(spider.spider_opened, signals.spider_opened) 
     crawler.signals.connect(spider.spider_closed, signals.spider_closed) 
     return spider 

    def spider_opened(self, spider): 
     print('Opening {} spider'.format(spider.name)) 

    def spider_closed(self, spider): 
     print('Closing {} spider'.format(spider.name)) 

İyi bir kullanım örümcek scrapy için tqdm ilerleme çubuğu eklemektir. Birçok örümcekler var ve onları kapatmadan her önce bir şeyler yapmak istiyorsanız

# -*- coding: utf-8 -*- 
from scrapy import signals 
from scrapy.linkextractors import LinkExtractor 
from scrapy.spiders import CrawlSpider, Rule 
from tqdm import tqdm 


class MySpider(CrawlSpider): 
    name = 'myspider' 
    allowed_domains = ['somedomain.comm'] 
    start_urls = ['http://www.somedomain.comm/ccid.php'] 

    rules = (
     Rule(LinkExtractor(allow=r'^http://www.somedomain.comm/ccds.php\?id=.*'), 
      callback='parse_item', 
      ), 
     Rule(LinkExtractor(allow=r'^http://www.somedomain.comm/ccid.php$', 
          restrict_xpaths='//table/tr[contains(., "SMTH")]'), follow=True), 
    ) 

    def parse_item(self, response): 
     self.pbar.update() # update progress bar by 1 
     item = MyItem() 
     # parse response 
     return item 

    @classmethod 
    def from_crawler(cls, crawler, *args, **kwargs): 
     spider = super(MySpider, cls).from_crawler(crawler, *args, **kwargs) 
     crawler.signals.connect(spider.spider_opened, signals.spider_opened) 
     crawler.signals.connect(spider.spider_closed, signals.spider_closed) 
     return spider 

    def spider_opened(self, spider): 
     self.pbar = tqdm() # initialize progress bar 
     self.pbar.clear() 
     self.pbar.write('Opening {} spider'.format(spider.name)) 

    def spider_closed(self, spider): 
     self.pbar.clear() 
     self.pbar.write('Closing {} spider'.format(spider.name)) 
     self.pbar.close() # close progress bar 
+3

Benim scrapy içinde 'def yakın (öz, sebep):', kapalı değil ' –

+2

@AminahNuraini Scrapy 1.0.4' def kapalı (sebep) ' –

4

scrapy sürümü 1.0.0+ için:, sadece böyle closed işlevini çağırabilirsiniz

from scrapy.signalmanager import SignalManager 
from scrapy.xlib.pydispatch import dispatcher 

class MySpider(CrawlSpider): 
    def __init__(self, *args, **kwargs): 
     super(MySpider, self).__init__(*args, **kwargs) 
     SignalManager(dispatcher.Any).connect(
      self.closed_handler, signal=signals.spider_closed) 

    def closed_handler(self, spider): 
     # do stuff here 
+0

Bu cevap seçilmiş olmalıdır, teşekkürler Levon –

0

, belki de projenizde statscollector eklemek uygun olacaktır. ayarlarında

:

STATS_CLASS = 'scraper.stats.MyStatsCollector' 

ve kolektör: mükemmel

from scrapy.statscollectors import StatsCollector 

class MyStatsCollector(StatsCollector): 
    def _persist_stats(self, stats, spider): 
     do something here