2014-09-22 4 views
6

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

https://github.com/darkrho/scrapy-redis

जाँच की है लेकिन मैं अपने उद्देश्यों के लिए अपने उपयुक्त नहीं लग रहा है के रूप में मैं कई कतारों (प्रत्येक मकड़ी के लिए एक एकल पंक्ति) की जरूरत है। जैसा कि मैंने सीखने के लिए आना है, एक तरीका स्पाइडर में start_requests विधि को ओवरराइड करना प्रतीत होता है। लेकिन यहां फिर से मैं स्पष्ट नहीं हूं कि क्या करना है (पाइथन और स्केपर के लिए नया)। क्या मैं इसे किसी भी सामान्य पायथन स्क्रिप्ट के रूप में देख सकता हूं और किसी (किसी भी) संदेश कतार का उपयोग करने के लिए विधि को ओवरराइड कर सकता हूं? इसके अलावा, मुझे कतार में अनुरोध होने पर 24 * 7 चलने वाले मकड़ी की आवश्यकता होती है और स्क्रैप की आवश्यकता होती है। मैंने सोचा कि मुझे सिग्नल का उपयोग करना चाहिए और कहीं भी डोंटक्लोस्पीडर अपवाद को बढ़ा देना चाहिए। लेकिन मैं यह कहां करूँ? मैं बहुत खो गया हूँ। कृपया मदद करे। abc.com से यूआरएल> - -

उपयोगकर्ता-> क्वेरी> एबीसी-मकड़ी

  -> url from xyz.com -> xyz-spider 

      -> url from ghi.com -> ghi-spider 

अब प्रत्येक यूआरएल एक ही बात के लिए स्क्रैप जा करने के लिए किया गया है:

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

QUERY1, QUERY2, QUERY3

abc.com -> url_abc1, url_abc2, url_abc3

xyz.com -> url_xyz1, url_xyz2, url_xyz3

GHI .com -> url_ghi1, url_ghi2, ​​url_ghi3

इसलिए प्रत्येक वेबसाइट के लिए, ये यूआरएल गतिशील रूप से आ रहे हैं जो उनके संबंधित संदेश कतारों पर धकेल दिए जाएंगे। अब वेबसाइट के लिए इस्तेमाल किए गए प्रत्येक मकड़ियों को अपनी संबंधित कतार का उपभोग करना चाहिए और संदेश कतार

+0

समस्या एकाधिक मकड़ियों को चला रहा है? – Nabin

+1

संख्या। समस्या यह है कि कैसे मकड़ी संदेश कतार (ओं) से उपभोग करने के लिए। – Avinragh

+0

पर एक नज़र डालें http://stackoverflow.com/questions/21694386/running-more-than-one-spiders-one-by-one – Nabin

उत्तर

4

पर अनुरोध करने पर मुझे स्क्रैप किए गए आइटम दें, यह भाग के रूप में स्केपर बनाने के लिए एक बहुत ही आम और (आईएमओ) उत्कृष्ट तरीका है डेटा पाइपलाइन का; मुझे हर व़क्त यह करना है।

आप सही हैं कि आप मकड़ी के start_requests() विधि को ओवरराइड करना चाहते हैं। मुझे नहीं पता कि अगर आपके पास start_requests() परिभाषित किया गया है और start_urls चर है, तो मैं स्प्रैक्ट व्यवहार करता हूं, लेकिन अगर आप डेटाबेस जैसे गतिशील स्रोत से उपभोग कर रहे हैं तो मैं केवल start_requests() का उपयोग करने की अनुशंसा करता हूं।

कुछ उदाहरण कोड, अवांछित लेकिन आपको सही विचार देना चाहिए .. अगर आपको अधिक जानकारी चाहिए तो कृपया मुझे बताएं। यह भी मानता है कि आपकी कतार एक और प्रक्रिया द्वारा आबादी है।

class ProfileSpider(scrapy.Spider): 
    name = 'myspider' 

    def start_requests(self): 
     while(True): 
      yield self.make_requests_from_url(
       self._pop_queue() 
      ) 

    def _pop_queue(self): 
     while(True): 
      yield self.queue.read() 

यह आपकी कतार को जनरेटर के रूप में उजागर करता है। यदि आप रिक्त लूपिंग की मात्रा को कम करना चाहते हैं (क्योंकि कतार बहुत समय खाली हो सकती है), तो आप _pop_queue लूप में नींद कमांड या घातीय बैकऑफ जोड़ सकते हैं। (यदि कतार खाली है, तो कुछ सेकंड के लिए सोएं और फिर से पॉप करने का प्रयास करें।)

मान लें कि आपके कोड में कोई घातक त्रुटियां नहीं होती हैं, मेरा मानना ​​है कि यह लूप/जेनरेटर के निर्माण के कारण समाप्त नहीं होना चाहिए।

+0

धन्यवाद! मुझे अपने मकड़ी को एक संदेश कतार – Avinragh

+0

काम नहीं कर रहा है। यह शिकायत करता है कि प्रारंभ अनुरोध प्राप्त करने में त्रुटि क्योंकि यह स्ट्रिंग यूआरएल की अपेक्षा करता है जहां इसे जनरेटर मिल रहा है –

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