2016-08-27 5 views
0

私はCrawlSpiderを実行していますが、実行中のリンクのいくつかに続いて、process_requestに関数を渡すことで、いくつかのロジックを実装したいと考えています。Scrapy CrawlSpiderにインスタンス変数を追加する方法は?

この関数は、リンクが削除または処理され続けます現在の状態を追跡するためにクモのクラス変数を使用し、それに応じて(とリファラURL上):

class BroadCrawlSpider(CrawlSpider): 
    name = 'bitsy' 
    start_urls = ['http://scrapy.org'] 
    foo = 5 

    rules = (
     Rule(LinkExtractor(), callback='parse_item', process_request='filter_requests', follow=True), 
    ) 

    def parse_item(self, response): 
     <some code> 

    def filter_requests(self, request): 
     if self.foo == 6 and request.headers.get('Referer', None) == someval: 
      raise IgnoreRequest("Ignored request: bla %s" % request) 
     return request 

私は、同じマシン上で複数のスパイダーを走らせると、同じ意図を持たない同じクラスの変数を使用すると思います。

インスタンスの変数をCrawlSpidersに追加する方法はありますか? Scrapyを実行すると、スパイダーのインスタンスは1つだけ作成されますか?

私はおそらくプロセスIDごとの値で辞書でそれを回避することができ、それは醜いになります...

答えて

1

私はspider argumentsはあなたのケースでは解決策になると思います。

scrapy crawl some_spiderようscrapyを呼び出すときに、あなたがscrapy crawl some_spider -a foo=barのような引数を追加することができ、そしてクモは例えば、そのコンストラクタを介して値を受け取ることになるが:

class SomeSpider(scrapy.Spider): 
    def __init__(self, foo=None, *args, **kwargs): 
     super(SomeSpider, self).__init__(*args, **kwargs) 
     # Do something with foo 

しかも、scrapy.Spider actually sets all additional arguments as instance attributesとして、あなたもする必要はありません__init__メソッドを明示的にオーバーライドしますが、.foo属性にアクセスするだけです。 :)

+0

ありがとうございました!私は可読性のために '__init__'を使うことを好むと思います。そうでなければ、これらの変数がどこから来ているのか理解できません。しかし、いったんこれを行うと、スパイダーに引数を渡すのをスキップして、インスタンス変数を '__init__ '内に設定するという単純な設定を使用するだけです。これは私がやることです。再度、感謝します! – UriCS

関連する問題