2017-02-09 7 views
0

動的に治療する方法はありますかは実行時に与えられるスパイダーの設定ですか? マニュアルに言ったように、このように、設定を操作しようとすると、私は私のクモにisDebug変数を追加すると、それの値に応じて、私は、ログレベル、パイプラインや他のさまざまな設定を調整したい...スパイダーのプロパティに基づいて治療の設定を更新する

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

私はいつもTypeError: Trying to modify an immutable Settings object

答えて

1

Settingsオブジェクト自体が不変であるが、元settings.sethttps://github.com/scrapy/scrapy/blob/129421c7e31b89b9b0f9c5f7d8ae59e47df36091/scrapy/settings/init.py#L234

ために、setメソッドの数を持っています(1.0から始まる)Scrapyクモのの

最近のバージョンでは、クモのcustom_settingsプロパティに提示するものと設定を上書きすることを目的としたクラスメソッドupdate_settings

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

を持っています。だから、あなたの目標を達成するために、あなたはその

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

のようないくつかの方法で、そのメソッドをオーバーライドして、それができるので、もちろん、プロジェクト全体のデバッグの目的のためにカスタム設定ファイルを持つ方法「ジャンゴの2つのスクープ」が存在することができますそのような何か:

settings.py(ファイルの末尾に追加):

try: 
    from dev_settings import * 
except ImportError: 
    pass 

、あなたがのsettings.pyの横dev_settings.pyを作成することができますし、開発目的にカスタマイズしたい設定を追加してください。dev_settings.pyが存在する場合は上書きされ、そうでない場合はインポートが無視されます。

+0

これは部分的に機能するようです。私の 'custom_debug_settings'は正しく設定されていますが、適用されません。私はログレベルを "DEBUG"に設定しようとしましたが、 'parse()'関数で 'self.settings.attributes ['LOG_LEVEL']'を呼び出すと、正しい値を返しますが、デバッグメッセージは表示されません。何か案は? – user1068464

+1

もちろん。 Scrapyのソースコードを見ると、spider custom_settingsを処理する前にloggerが作成されるので、設定を変更してデフォルトのロガーに影響を与える方法はありません。上記のインポート設定の方法を使用するか、カスタムログハンドラを追加するかカスタムロガーを作成する必要があります。 – mizhgun

+0

ありがとうございました。私の問題は別の問題なので、私はあなたの答えを受け入れました。インポート設定のアプローチは私のニーズには適していません。作成されたログは実際にスパイダーではなくクローラーによって作成されるため、カスタムログ処理も簡単ではないようです。そこで、私は、クローラで新しいロガーを作成する方法(スパイダーの実際の設定を使用する方法)があるかどうかを試してみます。 – user1068464

関連する問題