2012-05-11 101 views
5

我無法更改解析方法中的蜘蛛設置。但這絕對是一種方式。Scrapy。開始抓取後如何更改蜘蛛設置?

例如:

 
class SomeSpider(BaseSpider): 
    name = 'mySpider' 
    allowed_domains = ['example.com'] 
    start_urls = ['http://example.com'] 
    settings.overrides['ITEM_PIPELINES'] = ['myproject.pipelines.FirstPipeline'] 
    print settings['ITEM_PIPELINES'][0] 
    #printed 'myproject.pipelines.FirstPipeline' 
    def parse(self, response): 
     #...some code 
     settings.overrides['ITEM_PIPELINES'] = ['myproject.pipelines.SecondPipeline'] 
     print settings['ITEM_PIPELINES'][0] 
     # printed 'myproject.pipelines.SecondPipeline' 
     item = Myitem() 
     item['mame'] = 'Name for SecondPipeline' 

但是!物品將由FirstPipeline處理。新的ITEM_PIPELINES參數不起作用。 如何在開始抓取後更改設置?提前致謝!

+2

管道被初始化,然後在發動機啓動激活。我不確定你是否可以在執行期間改變它。但是,您可以在啓動時激活兩個管道,並在管道中添加一些邏輯,只有在滿足特定條件時纔會處理該項目。 –

+0

是的,這是我最後的選擇。感謝您的回覆。我認爲像蜘蛛信號這樣的東西可以提供幫助,但這很困難。 – fcmax

+0

當然,您可以將各種功能附加到各種蜘蛛信號。你可能想把擴展器中的處理器附加到信號上。另請參閱:http://doc.scrapy.org/zh/latest/topics/extensions.html#writing-your-own-extension –

回答

2

如果您希望不同的蜘蛛擁有不同的管道,您可以爲蜘蛛設置一個管道列表屬性,該屬性爲該蜘蛛定義管道。比管道檢查是否存在:

class MyPipeline(object): 

    def process_item(self, item, spider): 
     if self.__class__.__name__ not in getattr(spider, 'pipelines',[]): 
      return item 
     ... 
     return item 

class MySpider(CrawlSpider): 
    pipelines = set([ 
     'MyPipeline', 
     'MyPipeline3', 
    ]) 

如果你想,不同項目由不同管道中proceesed你可以這樣做:

class MyPipeline2(object): 
     def process_item(self, item, spider): 
      if isinstance(item, MyItem): 
       ... 
       return item 
      return item