2016-08-24 5 views
7

मैं स्क्रैप के लिए काफी नया हूं, मुझे पता है कि आइटम स्क्रैप किए गए डेटा को पॉप्युलेट करने के लिए उपयोग किए जाते हैं, लेकिन मैं आइटम और आइटम लोडर के बीच अंतर को समझ नहीं सकता। मैंने कुछ उदाहरण कोड पढ़ने की कोशिश की, उन्होंने आइटम लोडर का इस्तेमाल वस्तुओं के बजाय स्टोर करने के लिए किया और मुझे समझ में नहीं आया कि क्यों। स्केपर दस्तावेज मेरे लिए पर्याप्त स्पष्ट नहीं था। जब कोई आइटम लोडर का उपयोग किया जाता है और आइटम पर अतिरिक्त सुविधाएं प्रदान करते हैं, तो क्या कोई भी सरल स्पष्टीकरण (उदाहरण के साथ बेहतर) दे सकता है?स्कैपर में आइटम बनाम आइटम लोडर

उत्तर

8

मैं वास्तव में डॉक्स में आधिकारिक स्पष्टीकरण की तरह:

आइटम लोडर को आबाद करने के लिए एक सुविधाजनक तंत्र प्रदान आइटम स्क्रैप। यद्यपि आइटम को अपने शब्दकोश-जैसी एपीआई का उपयोग करके पॉप्युलेट किया जा सकता है, फिर भी आइटम लोडर कुछ सामान्य कार्यों को स्वचालित करने से पहले कच्चे निकाले गए डेटा को पार्स करने जैसे कार्यों को स्क्रैपिंग प्रक्रिया से पॉप्युलेट करने के लिए एक अधिक सुविधाजनक API प्रदान करते हैं।

दूसरे शब्दों में, आइटम स्क्रैप किए गए डेटा के कंटेनर प्रदान करते हैं, जबकि आइटम लोडर उस कंटेनर को पॉप्युलेट करने के लिए तंत्र प्रदान करते हैं।

अंतिम अनुच्छेद आपके प्रश्न का उत्तर देना चाहिए।
आइटम लोडर बहुत अच्छे हैं क्योंकि वे आपको बहुत से प्रोसेसिंग शॉर्टकट्स रखने की अनुमति देते हैं और सबकुछ साफ, साफ और समझने योग्य रखने के लिए कोड का एक समूह का पुन: उपयोग करते हैं।

तुलना उदाहरण केस। कहते हैं कि चलो हम इस आइटम को स्क्रैप करना चाहते हैं:

class MyItem(Item): 
    full_name = Field() 
    bio = Field() 
    age = Field() 
    weight = Field() 
    height = Field() 

मद केवल दृष्टिकोण कुछ इस तरह दिखेगा:

def parse(self, response): 
    full_name = response.xpath("//div[contains(@class,'name')]/text()").extract() 
    # i.e. returns ugly ['John\n', '\n\t ', ' Snow'] 
    item['full_name'] = ' '.join(i.strip() for i in full_name if i.strip()) 
    bio = response.xpath("//div[contains(@class,'bio')]/text()").extract() 
    item['bio'] = ' '.join(i.strip() for i in full_name if i.strip()) 
    age = response.xpath("//div[@class='age']/text()").extract_first(0) 
    item['age'] = int(age) 
    weight = response.xpath("//div[@class='weight']/text()").extract_first(0) 
    item['weight'] = int(age) 
    height = response.xpath("//div[@class='height']/text()").extract_first(0) 
    item['height'] = int(age) 
    return item 

बनाम आइटम लोडर दृष्टिकोण:

# define once in items.py 
from scrapy.loader.processors import Compose, MapCompose, Join, TakeFirst 
clean_text = Compose(MapCompose(lambda v: v.strip()), Join()) 
to_int = Compose(TakeFirst(), int) 

class MyItemLoader(ItemLoader): 
    default_item_class = MyItem 
    full_name_out = clean_text 
    bio_out = clean_text 
    age_out = to_int 
    weight_out = to_int 
    height_out = to_int 

# parse as many different places and times as you want 
def parse(self, response): 
    loader = MyItemLoader(selector=response) 
    loader.add_xpath('full_name', "//div[contains(@class,'name')]/text()") 
    loader.add_xpath('bio', "//div[contains(@class,'bio')]/text()") 
    loader.add_xpath('age', "//div[@class='age']/text()") 
    loader.add_xpath('weight', "//div[@class='weight']/text()") 
    loader.add_xpath('height', "//div[@class='height']/text()") 
    return loader.load_item() 

आप आइटम देख सकते हैं लोडर इतना साफ और स्केल करने में आसान है। आइए मान लें कि आपके पास 20 और फ़ील्ड हैं जिनमें से एक ही प्रसंस्करण तर्क साझा करते हैं, आइटम लोडर के बिना ऐसा करने के लिए आत्महत्या होगी। आइटम लोडर भयानक हैं और आपको उनका उपयोग करना चाहिए!

+1

आइटम उदाहरण बहुत सारे अनावश्यक चर बनाता है जो इसे बहुत अधिक अव्यवस्थित दिखता है, 'आइटम ["बायो"] = response.xpath ("// div [include (@ class,' bio ')]/text() ") निकालें()' –

+0

कूल सामान। धन्यवाद ! – Airbear

+0

@ पैड्राइक कनिंघम मुझे यहां कोई अनावश्यक चर नहीं दिख रहा है क्योंकि 'बायो' फ़ील्ड को धारीदार और शामिल किया जाना है। आपका उदाहरण केवल मूल्यों की एक सूची डालेगा बिना साफ किए। – Granitosaurus

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