2017-01-27 5 views
0

スパイダーのinit関数の後でScrapy設定をオーバーライドすることはできますか? たとえば、dbから設定を取得したい場合は、クエリパラメータを引数としてcmdlineから渡します。スパイダーのinit関数の後でScrapyの設定をオーバーライドできません

def __init__(self, spider_id, **kwargs): 
    self.spider_id = spider_id 
    self.set_params(spider_id) 
    super(Base_Crawler, self).__init__(**kwargs) 

def set_params(self): 
    #TODO 
    #makes a query in db 
    #get set variables from query result 
    #override settings 
+1

あなたは '__init__'の周りにクラスを投稿できますか?特に、他のクラスからそれを派生させますか? – hansaplast

+1

いいえ、その場で設定を上書きすることはできませんが、あなたの場合に役立つクラスパラメータを渡すことができます。 – eLRuLL

答えて

0

技術的には、スパイダーの初期化後に設定を上書きすることはできますが、ほとんどの場合、以前に適用されたため何も影響しません。

あなたが実際に行うことができますが元のため、-sを使用して-aを使用して、コマンドラインオプションとオーバーライドのプロジェクト設定とスパイダーにパラメータを渡すことです)

スパイダー:

class TheSpider(scrapy.Spider): 
    name = 'thespider' 

    def __init__(self, *args, **kwargs): 
     self.spider_id = kwargs.pop('spider_id', None) 
     super(TheSpider).__init__(*args, **kwargs) 

CLI

scrapy crawl thespider -a spider_id=XXX -s SETTTING_TO_OVERRIDE=YYY 

あなたが何かより高度なものが必要な場合は、あなたのスパイダーをラッピングするカスタムランナーを書くことを検討してください。以下はdocsからの例です:

from scrapy.crawler import CrawlerProcess 
from scrapy.utils.project import get_project_settings 

process = CrawlerProcess(get_project_settings()) 

# 'followall' is the name of one of the spiders of the project. 
process.crawl('followall', domain='scrapinghub.com') 
process.start() # the script will block here until the crawling is finished 

だけSettingsインスタンスを返す、独自のルーチンでget_project_settingsを交換してください。

とにかく、スパイダーのコードがクリーンで再利用可能な状態に保たれるように、非スクレイピングロジックでオーバーロードされないようにしてください。

関連する問題