2012-09-01 12 views
10

मैं एक सॉकर साइट स्क्रैप कर रहा हूं और स्पाइडर (एक स्पाइडर) साइट के पृष्ठों से कई प्रकार के आइटम प्राप्त करता है: टीम, मैच, क्लब इत्यादि। मैं कोशिश कर रहा हूं CSVItemExporter का उपयोग अलग-अलग सीएसवी फाइलों, teams.csv, match.csv, club.csv इत्यादि में स्टोर करने के लिए करें।प्रति आइटम सीएसवी फाइलों को अलग करने के लिए स्केपर निर्यात आइटम कैसे कर सकते हैं

मुझे यकीन नहीं है कि ऐसा करने का सही तरीका क्या है। एकमात्र तरीका मैंने सोचा है कि उदाहरण के लिए http://doc.scrapy.org/en/0.14/topics/exporters.html में अपनी खुद की कस्टम पाइपलाइन बनाना है और स्पाइडर_ओपेन विधि में सभी आवश्यक सीएसवी फाइलें खोलें, यानी प्रत्येक सीएसवी फ़ाइल के लिए एक सीएसवी निर्यातक बनाएं और process_item कोड को कोड में रखें यह पता लगाएं कि किस प्रकार का आइटम "आइटम" पैरामीटर है और फिर उसे संबंधित निर्यातक ऑब्जेक्ट पर भेज दें।

वैसे भी मुझे स्क्रैप में एकाधिक सीएसवी फाइलों (प्रति आइटम प्रकार) को संभालने का कोई उदाहरण नहीं मिला है, इसलिए मुझे चिंता है कि मैं इसका उपयोग इस तरह से कर रहा हूं जिसका उपयोग नहीं किया जा रहा है। (यह स्केरेपी के साथ मेरा पहला अनुभव है)।

diomedes

उत्तर

10

आप दृष्टिकोण मेरे लिए ठीक लगते हैं। पाइप्लाइन्स स्केरेपी की एक महान विशेषता है और आईएमओ आपके दृष्टिकोण की तरह कुछ के लिए निर्माण कर रहे हैं।

आप कई आइटम बना सकते हैं (उदा। सॉकरइटम, मैचइटेम) और आपके MultiCSVItemPipeline में आइटम आइटम की जांच करके प्रत्येक आइटम को अपने स्वयं के सीएसवी कक्षा में प्रतिनिधि दें।

+0

ठीक है, MultiCSVItemPipeline लिखने के बाद मैं बेहतर महसूस करता हूं :-)। मैं जांचता हूं कि आपने वस्तु वर्ग को यह पता लगाने के लिए सुझाव दिया कि आइटम कहां जाता है। मैं किसी भी प्रश्न के लिए कोड दिखाने के लिए स्वयं का जवाब दे रहा हूं। – Diomedes

13

मैं ऊपर कोड ड्रॉकोसॉस के उत्तर के आधार पर MultiCSVItemPipeline का उत्पादन करने के लिए उपयोग किया गया कोड पोस्ट कर रहा हूं।

यह पाइपलाइन मानती है कि सभी आइटम वर्ग सम्मेलन * आइटम (जैसे टीमइटम, इवेंट इटैम) का पालन करते हैं और team.csv, event.csv फाइलें बनाता है और सभी रिकॉर्ड उचित सीएसवी फाइलों में भेजता है।

from scrapy.exporters import CsvItemExporter 
from scrapy import signals 
from scrapy.xlib.pydispatch import dispatcher 


def item_type(item): 
    return type(item).__name__.replace('Item','').lower() # TeamItem => team 

class MultiCSVItemPipeline(object): 
    SaveTypes = ['team','club','event', 'match'] 
    def __init__(self): 
     dispatcher.connect(self.spider_opened, signal=signals.spider_opened) 
     dispatcher.connect(self.spider_closed, signal=signals.spider_closed) 

    def spider_opened(self, spider): 
     self.files = dict([ (name, open(CSVDir+name+'.csv','w+b')) for name in self.SaveTypes ]) 
     self.exporters = dict([ (name,CsvItemExporter(self.files[name])) for name in self.SaveTypes]) 
     [e.start_exporting() for e in self.exporters.values()] 

    def spider_closed(self, spider): 
     [e.finish_exporting() for e in self.exporters.values()] 
     [f.close() for f in self.files.values()] 

    def process_item(self, item, spider): 
     what = item_type(item) 
     if what in set(self.SaveTypes): 
      self.exporters[what].export_item(item) 
     return item 
+0

क्या आप कोड शामिल कर सकते हैं जहां आप कुछ मॉड्यूल आयात करते हैं? –

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