2016-07-08 15 views
0

einstellen derzeit IDynamisch pipelline Präsenz in scrapy

custom_settings = { "ITEM_PIPELINES" : { ... } } 

Pipelines pro-Spinne setzen verwenden. Als nächstes muss ich für bestimmte Start-URLs einige Pipelines ausschließen. Ich erkenne dies in __init__. Versucht, custom_settings neu zuzuweisen, aber das hat nicht funktioniert. Ist es möglich, die Pipeline-Liste dynamisch zu ändern?

Antwort

1

Nein, AFAIK Die benutzerdefinierten Einstellungen können während des Laufs der Spinne nicht geändert werden.

Die Lösung, die Sie hier suchen, besteht darin, die Erkennungslogik den Pipelines selbst hinzuzufügen. Fügen Sie zum Beispiel ein zusätzliches Feld zu dem Element _to_pipeline2 hinzu und brechen Sie Ihre Pipeline, wenn sie nicht vorhanden ist.
Zum Beispiel:

def parse(self, response): 
    item = MyItem() 
    #.... 
    if item_should_be_pipelined: 
     item['_to_pipeline2'] = True 
    return item 

und in der Pipeline:

def process_item(self, item, spider): 
    if not item.get("_to_pipeline2", False): 
     return item # do not use this pipeline 
    # normal pipeline continues otherwise 
    del item['_to_pipeline2'] 

oder für Ihren Fall:

def process_item(self, item, spider): 
    if 'http://stackoverflow.com' in spider.start_urls: 
     return item # do not use pipeline 
    # otherwise execute pipeline code here 
+0

Das Problem ist, dass es nicht einmal, wenn ich custom_settings funktioniert ändern in "__init__". – VladimirLenin

+1

ja könnte es sein, dass diese Einstellung geladen wird, wenn Crawler die Spinne auf Crawl-Initiierung zieht, so gibt es wirklich keine Möglichkeit, die Pipeline-Warteschlange danach ändern und würde wahrscheinlich eine wirklich schlechte Idee sowieso sein. Setzen Sie solche Logik in die Pipelines selbst ist in der Regel bevorzugte Ansatz, auch 'process_item 'erhält Spinne als Argument, so dass Sie" spider.start_urls "darin überprüfen und entweder ein Element zurückgeben/ändern können. Ich habe das Beispiel aktualisiert, um dies zu zeigen. – Granitosaurus