2012-05-11 27 views
5

Tôi không thể thay đổi cài đặt spider theo phương pháp phân tích cú pháp. Nhưng nó chắc chắn phải là một cách.Phế liệu. Làm thế nào để thay đổi cài đặt nhện sau khi bắt đầu thu thập thông tin?

Ví dụ:

 
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' 

Nhưng! Mục sẽ được xử lý bởi FirstPipeline. Thông số ITEM_PIPELINES mới không hoạt động. Làm cách nào để thay đổi cài đặt sau khi bắt đầu thu thập thông tin? Cảm ơn trước!

+2

Đường ống được khởi tạo và kích hoạt khi khởi động động cơ. Tôi không chắc chắn nếu bạn có thể thay đổi điều này trong khi thực hiện. Tuy nhiên, bạn có thể kích hoạt cả hai đường ống lúc bắt đầu và thêm một số logic vào đường ống mà sẽ chỉ xử lý một mục nếu nó đáp ứng một điều kiện nhất định. –

+0

Vâng, đây là lựa chọn cuối cùng của tôi. Cảm ơn bạn đã trả lời. Tôi nghĩ rằng một cái gì đó giống như tín hiệu nhện có thể giúp đỡ, nhưng nó là khá diffcult. – fcmax

+0

Để chắc chắn, bạn có thể gắn các chức năng khác nhau vào các tín hiệu nhện khác nhau. Bạn muốn gắn các trình xử lý vào các tín hiệu trong một phần mở rộng tho. Xem thêm: http://doc.scrapy.org/en/latest/topics/extensions.html#writing-your-own-extension –

Trả lời

2

Nếu bạn muốn những con nhện khác nhau có đường ống khác nhau, bạn có thể đặt cho một con nhện một thuộc tính danh sách đường ống xác định đường ống cho con nhện đó. So với đường ống kiểm tra sự tồn tại:

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

Nếu bạn muốn rằng các mục khác nhau để được proceesed bằng đường ống khác nhau mà bạn có thể làm điều này:

class MyPipeline2(object): 
     def process_item(self, item, spider): 
      if isinstance(item, MyItem): 
       ... 
       return item 
      return item 
Các vấn đề liên quan