2011-08-19 14 views
13

मुझे एक फ़ाइल (.pdf) को सहेजने की ज़रूरत है, लेकिन मुझे यकीन है कि यह कैसे करना है। मुझे .pdfs को सहेजने और उन्हें इस तरह से स्टोर करने की आवश्यकता है कि वे एक निर्देशिका में व्यवस्थित हों जैसे कि वे उस साइट पर संग्रहीत हैं जैसे मैं उन्हें स्क्रैप कर रहा हूं।क्या मुझे स्केपर के साथ फाइलों को सहेजने के लिए पाइपलाइन बनाना चाहिए?

मैं क्या इकट्ठा कर सकते हैं मैं एक पाइपलाइन बनाने की जरूरत है, लेकिन से मैं क्या समझ पाइपलाइनों "आइटम" और "आइटम" की तरह तार/संख्या सिर्फ बुनियादी डेटा कर रहे हैं बचाने के लिए से। फ़ाइलों को पाइपलाइनों का उचित उपयोग सहेज रहा है, या क्या मुझे इसके बजाय मकड़ी में फ़ाइल को सहेजना चाहिए?

+0

क्यों बल्कि एक FEED_EXPORTER का उपयोग नहीं कर एक से पाइपलाइन? –

उत्तर

14

हाँ और नहीं [1]। यदि आप एक पीडीएफ लाते हैं तो इसे स्मृति में संग्रहीत किया जाएगा, लेकिन यदि पीडीएफ आपकी उपलब्ध मेमोरी को भरने के लिए पर्याप्त नहीं हैं तो यह ठीक है।

आप मकड़ी कॉलबैक में पीडीएफ को बचा सकता है:

def parse_listing(self, response): 
    # ... extract pdf urls 
    for url in pdf_urls: 
     yield Request(url, callback=self.save_pdf) 

def save_pdf(self, response): 
    path = self.get_path(response.url) 
    with open(path, "wb") as f: 
     f.write(response.body) 

आप एक पाइप लाइन में यह करने के लिए चुनते हैं:

# in the spider 
def parse_pdf(self, response): 
    i = MyItem() 
    i['body'] = response.body 
    i['url'] = response.url 
    # you can add more metadata to the item 
    return i 

# in your pipeline 
def process_item(self, item, spider): 
    path = self.get_path(item['url']) 
    with open(path, "wb") as f: 
     f.write(item['body']) 
    # remove body and add path as reference 
    del item['body'] 
    item['path'] = path 
    # let item be processed by other pipelines. ie. db store 
    return item 

[1] एक और दृष्टिकोण केवल दुकान pdfs 'यूआरएल हो सकता है और स्मृति में बफर किए बिना दस्तावेजों को लाने के लिए एक और प्रक्रिया का उपयोग करें। (wget जैसे)

एक FilesPipeline है कि आप सीधे उपयोग कर सकते हैं, यह मानते हुए आप पहले से ही फ़ाइल यूआरएल है, लिंक FilesPipeline उपयोग करने के लिए कैसे पता चलता
+0

क्या यह क्रॉलस्पीडर के साथ काम करता है, क्योंकि मैंने मकड़ी में पीडीएफ की बचत को लागू करने के लिए घंटों बिताए और कॉलबैक फ़ंक्शन कभी नहीं कहा जाता है। – Kex

+0

@Kex यह बताना मुश्किल है कि आपका कोड देखे बिना क्या गलत है। एक आम गड़बड़ी 'पार्स' कॉलबैक ओवरराइड कर रही है या लिंक निकालने वालों में सही पैटर्न का उपयोग नहीं कर रही है। – Rolando

+0

मैंने इसके बिना समस्या हल की, अब मैं नियमों के भीतर SgmlLinkExtractor का उपयोग करके पीडीएफ फ़ाइलों को डाउनलोड करता हूं और प्रतिक्रिया को पीडीएफ फ़ाइल में सहेजता हूं। – Kex

3

यह काम के लिए एक आदर्श उपकरण है। जिस तरह से स्केपर काम करता है वह यह है कि आपके पास मकड़ियों हैं जो वेब पृष्ठों को संरचित डेटा (आइटम) में बदलते हैं। पाइपलाइन पोस्टप्रोसेसर हैं, लेकिन वे स्पाइडर के रूप में एक ही एसिंक्रोनस इंफ्रास्ट्रक्चर का उपयोग करते हैं, इसलिए यह मीडिया फ़ाइलों को लाने के लिए बिल्कुल सही है।

आपके मामले में, आप पहली बार पीडीएफ़ का स्थान मकड़ी में, निकालने के लिए उन्हें पाइप लाइन में लाए जाने और आइटम को बचाने के लिए एक और पाइप लाइन होगा।

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