2012-05-11 7 views
5

Ich kann Spider-Einstellungen in Parse-Methode nicht ändern. Aber es muss definitiv ein Weg sein.Scrapy. Wie ändere ich die Spider-Einstellungen nach dem Crawlen?

Zum Beispiel:

 
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' 

Aber! Artikel wird von FirstPipeline bearbeitet. Neue ITEM_PIPELINES-Parameter funktionieren nicht. Wie kann ich die Einstellungen nach dem Crawlen ändern? Danke im Voraus!

+2

Pipelines initialisiert und auf dem Motorstart aktiviert. Ich bin mir nicht sicher, ob Sie das während der Ausführung ändern können. Sie könnten jedoch beide Pipelines beim Start aktivieren und eine Logik in der Pipeline hinzufügen, die nur dann ein Element verarbeitet, wenn es eine bestimmte Bedingung erfüllt. –

+0

Ja, das ist meine letzte Option. Danke für deine Antwort. Ich denke, dass etwas wie Spinnensignale helfen kann, aber es ist ziemlich schwierig. – fcmax

+0

Sicher können Sie verschiedene Funktionen an verschiedene Spinnensignale anhängen. Sie möchten Handler an Signale in einer Nebenstelle anhängen. Siehe auch: http://doc.scrapy.org/en/latest/topics/extensions.html#writing-your-own-extension –

Antwort

2

Wenn Sie möchten, dass verschiedene Spider unterschiedliche Pipelines haben, können Sie für ein Spider ein Pipelines List-Attribut festlegen, das die Pipelines für dieses Spider definiert. Als in Pipelines überprüfen Existenz:

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', 
    ]) 

Wenn Sie möchten, dass verschiedene Elemente von verschiedenen Pipelines proceesed werden Sie dies tun können:

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