2014-05-22 6 views
5

का उपयोग करके रिक्त फ़ील्ड वाले आइटमों को अनदेखा करना है, मैं जानना चाहता हूं कि उन सभी वस्तुओं को अनदेखा कैसे करें जो सभी फ़ील्ड भरते हैं, कुछ प्रकार की ड्रॉपिंग, क्योंकि स्कैरेड के आउटपुट में मुझे ऐसे पृष्ठ मिल रहे हैं जो नहीं हैं सभी क्षेत्रों को भरें।स्क्रैकर लोडर

मुझे लगता है कि कोड है:

class Product(scrapy.Item): 
    source_url = scrapy.Field(
     output_processor = TakeFirst() 
    ) 
    name = scrapy.Field(
     input_processor = MapCompose(remove_entities), 
     output_processor = TakeFirst() 
    ) 
    initial_price = scrapy.Field(
     input_processor = MapCompose(remove_entities, clear_price), 
     output_processor = TakeFirst() 
    ) 
    main_image_url = scrapy.Field(
     output_processor = TakeFirst() 
    ) 

पार्सर:

def parse_page(self, response): 
    try: 
     l = ItemLoader(item=Product(), response=response) 
     l.add_value('source_url', response.url) 
     l.add_css('name', 'h1.title-product::text') 
     l.add_css('main_image_url', 'div.pics a img.zoom::attr(src)') 

     l.add_css('initial_price', 'ul.precos li.preco_normal::text') 
     l.add_css('initial_price', 'ul.promocao li.preco_promocao::text') 

     return l.load_item() 

    except Exception as e: 
     print self.log("#1 ERRO: %s" % e), response.url 

मैं अपने खुद के चयनकर्ता (प्रसंस्करण आइटम दो बार से बचने के लिए) के साथ बनाने के लिए आवश्यकता के बिना लोडर के साथ करना चाहते हैं। मुझे लगता है कि मैं उन्हें पाइपलाइन में छोड़ सकता हूं लेकिन शायद यह सबसे अच्छा तरीका नहीं है क्योंकि ये आइटम मान्य नहीं हैं।

+1

पाइपलाइन में आइटम छोड़ना एक बुरा तरीका नहीं है, काफी विपरीत IMHO। –

उत्तर

8

डेटा का सत्यापन पाइपलाइनों के लिए सामान्य उपयोग मामले में से एक है।

from scrapy.exceptions import DropItem 

class YourPersonalPipeline(object): 
    def process_item(self, item, spider): 
     required_fields = [] # your list of required fields 
     if all(field in item for field in required_fields): 
      return item 
     else: 
      raise DropItem("your reason") 

आप settings.py Read more in scrapy docs में पाइपलाइन सक्षम करना होगा: आपके मामले में आप केवल आवश्यक फ़ील्ड के लिए जाँच करने के लिए कोड के कुछ छोटी राशि, की तर्ज पर कुछ लिखने के लिए की जरूरत है।

संबंधित मुद्दे