2013-02-03 16 views
5

के साथ कई फ़ाइलों को लिखना मैं स्क्रैप के साथ एक वेबसाइट स्क्रैप कर रहा हूं और परिणाम को दो भागों में विभाजित करना चाहता हूं। आम तौर पर मैं इस प्रकार स्केपर को कॉल करता हूं:स्केपर

$ scrapy crawl articles -o articles.json 
$ scrapy crawl authors -o authors.json 

दो मकड़ियों पूरी तरह से स्वतंत्र हैं और बिल्कुल संवाद नहीं करते हैं। यह सेटअप छोटी वेबसाइटों के लिए काम करता है, लेकिन बड़ी वेबसाइटों के पास इस तरह क्रॉल करने के लिए मेरे बहुत सारे लेखक हैं।

मेरे पास articles स्पाइडर authors स्पाइडर को बताएगा कि कौन से पृष्ठ इस दो-फ़ाइल संरचना को क्रॉल और बनाए रखने के लिए हैं? आदर्श रूप से, मैं लेखक को यूआरएल को फाइल में नहीं लिखूंगा और फिर इसे अन्य मकड़ी के साथ वापस पढ़ूंगा।

+0

मुझे लगता है कि समस्या फाइलों का आकार होगी। यह समाधान बहुत अच्छी तरह से स्केल नहीं करेगा (जैसा कि मुझे यकीन है कि आपने पहले ही देखा है)। क्या आप इसके लिए डेटाबेस या स्टोर के बारे में हैं? इसके लिए कुछ स्कीमा-कम समाधान मेरे दिमाग में आएगा। मुझे नहीं लगता कि आप केवल 2 बड़ी फाइलों से खुश होंगे। – DrColossos

उत्तर

1

मैं लेखक स्क्रेपर के लिए आदेश पंक्ति तर्क का उपयोग कर समाप्त हो गया उपयोग नहीं कर रहा है:

class AuthorSpider(BaseSpider): 
    ... 

    def __init__(self, articles): 
     self.start_urls = [] 

     for line in articles: 
      article = json.loads(line) 
      self.start_urls.append(data['author_url']) 

फिर, मैं डुप्लिकेट पाइपलाइन में उल्लिखित जोड़ा Scrapy documentation:

from scrapy import signals 
from scrapy.exceptions import DropItem 

class DuplicatesPipeline(object): 
    def __init__(self): 
     self.ids_seen = set() 

    def process_item(self, item, spider): 
     if item['id'] in self.ids_seen: 
      raise DropItem("Duplicate item found: %s" % item) 
     else: 
      self.ids_seen.add(item['id']) 
      return item 

अंत में, मैं लेख पारित कर दिया JSON लाइनों आदेश में दायर:

$ scrapy crawl authors -o authors.json -a articles=articles.json 

यह एक अच्छा समाधान नहीं है, लेकिन यह काम करता है।

0

सभी अपने व्यापार तर्क पर निर्भर करता है, लेकिन यहाँ मेरा सुझाव

मैं प्रत्येक लेख मान रहा हूँ एक लेखक/लेखकों होना चाहिए।

तो लेख & लेखकों को प्राप्त करने के लिए आप एक ही पृष्ठ को कई बार क्यों क्रॉल कर रहे हैं?

इसलिए मुझे लगता है कि आपके क्रॉलर को केवल लेखों को क्रॉल करना चाहिए जिसमें लेखकों और लेखकों को एक स्क्रैपर और उपयोग स्केपर pipeline के साथ एक ही समय में निकालना चाहिए ताकि लेख और लेखकों को अलग कर सकें।

एक और बिंदु बहुत बड़ा डेटा json के लिए है की सिफारिश की jsonlines

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