2012-05-11 23 views
5

Nie mogę zmienić ustawień pająka w metodzie parsowania. Ale to zdecydowanie musi być droga.Scrapy. Jak zmienić ustawienia pająka po rozpoczęciu indeksowania?

Na przykład:

 
class SomeSpider(BaseSpider): 
    name = 'mySpider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://example.com'] 
    settings.overrides['ITEM_PIPELINES'] = ['myproject.pipelines.FirstPipeline'] 
    print settings['ITEM_PIPELINES'][0] 
    #printed 'myproject.pipelines.FirstPipeline' 
    def parse(self, response): 
     #...some code 
     settings.overrides['ITEM_PIPELINES'] = ['myproject.pipelines.SecondPipeline'] 
     print settings['ITEM_PIPELINES'][0] 
     # printed 'myproject.pipelines.SecondPipeline' 
     item = Myitem() 
     item['mame'] = 'Name for SecondPipeline' 

Ale! Przedmiot zostanie przetworzony przez FirstPipeline. Nowe parametry ITEM_PIPELINES nie działają. Jak mogę zmienić ustawienia po rozpoczęciu pobierania? Z góry dziękuję!

+2

Rurociągi są inicjowane i aktywowane przy starcie silnika. Nie jestem pewien, czy możesz to zmienić podczas wykonywania. Można jednak aktywować oba potoki przy starcie i dodać trochę logiki do potoku, który przetwarza tylko element, jeśli spełnia określony warunek. –

+0

Tak, to moja ostatnia opcja. Dziękuję za odpowiedź. Myślę, że coś w rodzaju sygnałów pająka może pomóc, ale jest to dość trudne. – fcmax

+0

Na pewno można dołączyć różne funkcje do różnych sygnałów pająka. Chciałbyś dołączyć obsługę do sygnałów w rozszerzeniu. Zobacz także: http://doc.scrapy.org/en/latest/topics/extensions.html#writing-your-own-extension –

Odpowiedz

2

Jeśli chcesz, aby różne pająki miały różne potoki, możesz ustawić dla pająka atrybut listy rurociągów, który definiuje potoki dla tego pająka. Niż w rurociągach sprawdzenia istnienia:

class MyPipeline(object): 

    def process_item(self, item, spider): 
     if self.__class__.__name__ not in getattr(spider, 'pipelines',[]): 
      return item 
     ... 
     return item 

class MySpider(CrawlSpider): 
    pipelines = set([ 
     'MyPipeline', 
     'MyPipeline3', 
    ]) 

Jeśli chcesz, że różne przedmioty do proceesed różnych rurociągów można to zrobić:

class MyPipeline2(object): 
     def process_item(self, item, spider): 
      if isinstance(item, MyItem): 
       ... 
       return item 
      return item 
Powiązane problemy