2010-03-07 9 views
12

मैं एक उपयोगकर्ता विन्यास वेब मकड़ी/क्रॉलर बनाने की जरूरत के लिए एक Scrapy मकड़ी का उपयोग करना, और मैं Scrapy उपयोग करने के बारे में सोच रहा हूँ। लेकिन, मैं डोमेन को हार्ड-कोड नहीं कर सकता और यूआरएल regex की अनुमति नहीं दे सकता: es - यह एक जीयूआई में विन्यास योग्य होगा। तों गतिशील विन्यास हैं:कई वेबसाइटों

मैं कैसे (हो सके, आसान) एक मकड़ी या Scrapy साथ मकड़ियों जहां डोमेन और अनुमति यूआरएल regex का एक सेट बना सकता हूँ? जैसे मैं एक फ़ाइल में विन्यास लिखता हूं, और मकड़ी इसे किसी भी तरह पढ़ता है।

+2

@Christian Daven: अपने प्रश्न के लिए उत्तर स्वीकार्य नहीं था? – dangra

उत्तर

10

चेतावनी: यह जवाब Scrapy v0.7 के लिए था, मकड़ी प्रबंधक API एक बहुत तब से बदल दिया है।

अवहेलना डिफ़ॉल्ट SpiderManager वर्ग, कहीं और किसी डेटाबेस से अपने कस्टम नियमों लोड या और अपने खुद के नियमों/regexes के साथ एक कस्टम मकड़ी instanciate और DOMAIN_NAME

mybot में

/settings.py:

SPIDER_MANAGER_CLASS = 'mybot.spidermanager.MySpiderManager' 
mybot में

/spidermanager.py:

from mybot.spider import MyParametrizedSpider 

class MySpiderManager(object): 
    loaded = True 

    def fromdomain(self, name): 
     start_urls, extra_domain_names, regexes = self._get_spider_info(name) 
     return MyParametrizedSpider(name, start_urls, extra_domain_names, regexes) 

    def close_spider(self, spider): 
     # Put here code you want to run before spiders is closed 
     pass 

    def _get_spider_info(self, name): 
     # query your backend (maybe a sqldb) using `name` as primary key, 
     # and return start_urls, extra_domains and regexes 
     ... 
     return (start_urls, extra_domains, regexes) 

और अब अपने कस्टम मकड़ी वर्ग, mybot/spider.py में:

from scrapy.spider import BaseSpider 

class MyParametrizedSpider(BaseSpider): 

    def __init__(self, name, start_urls, extra_domain_names, regexes): 
     self.domain_name = name 
     self.start_urls = start_urls 
     self.extra_domain_names = extra_domain_names 
     self.regexes = regexes 

    def parse(self, response): 
     ... 

नोट्स:

  • आप CrawlSpider भी विस्तार कर सकते हैं यदि आप अपने नियम प्रणाली का लाभ लेने के
  • एक मकड़ी उपयोग को चलाने के लिए चाहते हैं: ./scrapy-ctl.py crawl <name>, जहां name SpiderManager.fromdomain को पारित कर दिया है और बैकएंड प्रणाली
  • से अधिक मकड़ी की जानकारी नहीं निकाला जा समाधान डिफ़ॉल्ट SpiderManager ओवरराइड करता है के रूप में, एक क्लासिक मकड़ी (मकड़ी प्रति एक अजगर मॉड्यूल) कोडिंग कुंजी है मुझे लगता है कि यह आपके लिए कोई मुद्दा नहीं है नहीं है काम करता है, लेकिन,।डिफ़ॉल्ट मकड़ियों प्रबंधक पर अधिक जानकारी TwistedPluginSpiderManager
+0

एलेक्स मार्टेलि दृष्टिकोण के साथ अंतर यह है कि मकड़ियों को मांग पर तत्काल किया जाता है, बजाय उनमें से सभी को केवल एक का उपयोग करने के लिए। यह दृष्टिकोण आपके बैकएंड पर लोड को कम कर सकता है और आपके स्केपर बॉट प्रक्रिया की स्मृति पदचिह्न को कम कर सकता है। – dangra

+0

और मैं प्रति कस्टम स्पाइडर (ITEM_PIPELINES, USER_AGENT, आदि) सेटिंग्स कैसे निर्दिष्ट करूं? इसके अलावा आप './scrapy-ctl.py क्रॉल ' का उल्लेख करते हैं। 'Scrapy-ctl.py' क्या है? – warvariuc

3

domo पर बेशर्म आत्म पदोन्नति! आपको अपनी परियोजना के लिए उदाहरणों में दिए गए क्रॉलर को तुरंत चालू करने की आवश्यकता होगी।

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

4

आप क्या जरूरत है गतिशील रूप से मकड़ी कक्षाएं बनाने के लिए, के रूप में scrapy द्वारा आपूर्ति अपने पसंदीदा सामान्य मकड़ी वर्ग उपवर्गीकरण extra_domain_names है (XmlFeedSpider के साथ अपने rules जोड़ा CrawlSpider उपवर्गों, या, या जो कुछ भी) और domain_name जोड़ने, start_urls, और संभवतः (और/या start_requests(), आदि), जैसा कि आप उन्हें अपने जीयूआई (या कॉन्फ़िगरेशन फ़ाइल, या जो भी) से प्राप्त करते हैं या घटाते हैं।

पायथन क्लास ऑब्जेक्ट्स के ऐसे गतिशील निर्माण को निष्पादित करना आसान बनाता है; एक बहुत ही सरल उदाहरण हो सकता है:

from scrapy import spider 

def makespider(domain_name, start_urls, 
       basecls=spider.BaseSpider): 
    return type(domain_name + 'Spider', 
       (basecls,), 
       {'domain_name': domain_name, 
       'start_urls': start_urls}) 

allspiders = [] 
for domain, urls in listofdomainurlpairs: 
    allspiders.append(makespider(domain, urls)) 

यह आपको बहुत नंगे हड्डी मकड़ी कक्षाओं की एक सूची देता है - आप शायद उन्हें parse तरीकों को जोड़ने के लिए इससे पहले कि आप उन्हें का दृष्टांत चाहता हूँ। स्वाद के लिए मौसम...;-)।

+0

और यह कोड कहाँ होगा? मैंने अपने स्पाइडर मॉड्यूल में गतिशील रूप से क्रॉलर कक्षाओं को जोड़ने की कोशिश की लेकिन स्केपर उन्हें नहीं उठाता है। –

0

अब यह इन उद्देश्यों के लिए scrapy कॉन्फ़िगर करने के लिए बहुत आसान है:

  1. पहले यूआरएल के बारे में यात्रा करने के लिए, आप मकड़ी फोन पर एक विशेषता के रूप में यह पारित कर सकते हैं -a के साथ, और स्थापना के लिए start_requests फ़ंक्शन का उपयोग कैसे मकड़ी

  2. शुरू करने के लिए सेट करने के लिए मकड़ियों के लिए allowed_domains चर जरूरत नहीं है। यदि आप उस वर्ग चर शामिल नहीं करते हैं, तो स्पाइडर प्रत्येक डोमेन को अनुमति देने में सक्षम होगा।

यह की तरह कुछ करने के लिए खत्म हो जाना चाहिए:

class MySpider(Spider): 

    name = "myspider" 

    def start_requests(self): 
     yield Request(self.start_url, callback=self.parse) 


    def parse(self, response): 
     ... 

और उसे अपने साथ बुलाना चाहिए:

scrapy crawl myspider -a start_url="http://example.com" 
संबंधित मुद्दे