2017-02-09 3 views
0

Gibt es eine Möglichkeit, mit Scrapy dynamisch Set die Einstellungen für eine Spinne zur Laufzeit gegeben? Ich möchte eine isDebug Variable meine Spinne hinzuzufügen und es abhängig ist Wert I Log-Level anpassen möchten, Rohrleitungen und verschiedene andere Einstellungen ...Scrapy-Einstellungen auf Basis der Spider-Eigenschaft aktualisieren

Wenn die Einstellungen zu manipulieren versuchen, im Handbuch sagte wie, wie folgt aus:

def from_crawler(cls, crawler): 
     settings = crawler.settings 
     settings['USER_AGENT'] = 'Overwridden-UA' 

ich bekomme immer TypeError: Trying to modify an immutable Settings object

Antwort

1

Settings Objekt ist unveränderlich von selbst, sondern hat Anzahl von Set-Methoden, für ex settings.sethttps://github.com/scrapy/scrapy/blob/129421c7e31b89b9b0f9c5f7d8ae59e47df36091/scrapy/settings/init.py#L234

Neuere Versionen von Scrapy Spinnen (1,0 Anfang) hat Klassenmethode update_settings

@classmethod 
def update_settings(cls, settings): 
    settings.setdict(cls.custom_settings or {}, priority='spider') 

die in custom_settings Eigenschaft der Spinne präsentiert Einstellungen mit Einsen überschrieben werden soll. So erreichen Sie Ihr Ziel können Sie diese Methode in irgendeiner Weise außer Kraft setzen, wie die

class TheSpider(scrapy.Spider): 
    name = 'thespider' 
    is_debug = True 
    custom_debug_settings = { 
     # Put your debug settings here 
    } 

    @classmethod 
    def update_settings(cls, settings): 
     settings.setdict(getattr(cls, 'custom_debug_settings' \ 
             if getattr(cls, 'is_debug', False) \ 
             else 'custom_settings', None) or {}, 
         priority='spider') 

Und natürlich gibt es projektweiten ‚zwei Kugeln Django‘ Art und Weise benutzerdefinierte Einstellungsdatei für Debug-Zwecke zu haben, so dass es sein könnte, so ähnlich:

settings.py (fügen Sie am Ende der Datei):

try: 
    from dev_settings import * 
except ImportError: 
    pass 

dann können Sie dev_settings.py neben settings.py erstellen und Fügen Sie dort Einstellungen hinzu, die Sie für Ihre Entwicklungszwecke anpassen möchten - sie werden überschrieben, wenn dev_settings.py existiert oder der Import ignoriert wird, wenn nicht.

+0

Dies scheint teilweise zu funktionieren. Meine 'custom_debug_settings' sind korrekt ausgefüllt, werden jedoch nicht angewendet. Ich habe versucht, die Log-Ebene auf "DEBUG" zu setzen, und wenn ich 'self.settings.attributes ['LOG_LEVEL']' in einer 'parse()' -Funktion aufruft, gibt es den korrekten Wert, aber es zeigt keine Debug-Meldungen an. Irgendwelche Ideen? – user1068464

+1

Natürlich. Wenn Sie sich den Scrapy-Quellcode ansehen, werden Sie sehen, dass er vor der Verarbeitung von spider custom_settings Logger erstellt, so dass es keine Möglichkeit gibt, den Standard-Logger durch Ändern von Einstellungen zu beeinflussen. Sie sollten entweder den Import-Einstellungen Ansatz von oben verwenden oder benutzerdefinierte Protokollhandler hinzufügen/benutzerdefinierte Logger erstellen. – mizhgun

+0

Vielen Dank für die Hilfe. Ich habe deine Antwort jetzt auch akzeptiert, da mein Problem eine andere Sache ist. Der Importeinstellungen-Ansatz ist für meine Bedürfnisse nicht durchführbar. Die Handhabung benutzerdefinierter Protokolle gestaltet sich ebenfalls nicht so einfach, da die erstellten Protokolle nicht wirklich vom Spider, sondern vom Crawler stammen. Also werde ich versuchen, herauszufinden, ob es eine Möglichkeit gibt, einen neuen Logger im Crawler zu erstellen (mit den tatsächlichen Einstellungen des Spiders). – user1068464

Verwandte Themen