स्क्रैपी स्पाइडर में उपयोगकर्ता परिभाषित तर्क कैसे पारित करें


100

मैं एक उपयोगकर्ता परिभाषित तर्क को एक स्क्रैपर्स मकड़ी को पारित करने की कोशिश कर रहा हूं। क्या कोई सुझाव दे सकता है कि वह कैसे करे?

मैंने एक पैरामीटर के बारे में -aकहीं पढ़ा है लेकिन इसका उपयोग करने का कोई तरीका नहीं है।

जवाबों:


188

विकल्प crawlका उपयोग करके कमांड में स्पाइडर तर्क पारित किए जाते हैं -a। उदाहरण के लिए:

scrapy crawl myspider -a category=electronics -a domain=system

मकड़ियों को तर्कों के रूप में एक्सेस कर सकते हैं:

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

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

स्क्रेपी डॉक्टर से लिया गया: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

अद्यतन 2013 : दूसरा तर्क जोड़ें

अद्यतन २०१५ : शब्दों को समायोजित करें

अपडेट २०१६ : नए बेस क्लास का उपयोग करें और सुपर जोड़ें, धन्यवाद @ बिरला

अपडेट 2017 : पायथन 3 सुपर का उपयोग करें

# previously
super(MySpider, self).__init__(**kwargs)  # python2

अपडेट 2018 : जैसा कि @eLRuLL बताते हैं , मकड़ियों तर्कों को विशेषताओं के रूप में एक्सेस कर सकते हैं


3
मैला-कुचैला मैस्पाइडर-ए श्रेणी = इलेक्ट्रॉनिक्स-ए डोमेन = प्रणाली
स्टीवन अल्मरोथ

1
उपरोक्त कोड केवल आंशिक रूप से मेरे लिए काम कर रहा है। उदाहरण के लिए। यदि मैं डोमेन का उपयोग करते हुए परिभाषित करता हूं self.domain, तो मैं अभी भी इसे __init__विधि के बाहर एक्सेस नहीं कर पा रहा हूं । अजगर एक परिभाषित त्रुटि नहीं फेंकता है। BTW, आपने superकॉल क्यों छोड़ा है ? पुनश्च। मैं CrawlSpider वर्ग के साथ काम कर रहा हूँ
बिरला

2
अगर मुझे गलत समझा गया, तो कृपया मुझे सही करें, लेकिन इनमें से प्रत्येक समवर्ती कॉल मकड़ी के विभिन्न उदाहरण होंगे, है ना?
एल लॉलिएट

1
@ बिड़ला, क्लास स्कोप वेरिएबल को पॉप्युलेट करने के लिए कंस्ट्रक्टर में self.domain = डोमेन का उपयोग करें।
हसन रज़ा

1
@nealmcb मकड़ी वर्ग की __init__एक विधि है। इसके कार्यान्वयन से मकड़ी खुद को कम मजबूत नहीं बनाती है और यह जवाब देने के लिए शामिल है कि आप कीवर्ड तर्क के लिए चूक की घोषणा कर सकते हैं, लेकिन जैसा कि आपने कहा कि यह वैकल्पिक है। जैसा कि हमने पिछले वर्ष बताया था कि आपको उपयोग करने की आवश्यकता नहीं है, getattrआप केवल तर्कों को एक्सेस कर सकते हैं, उदाहरण के लिए self.categoryया जैसा कि हम उत्तर में देखते हैंself.domain
स्टीवन अल्मरोथ

31

पिछले उत्तर सही थे, लेकिन आपको कंस्ट्रक्टर को घोषित करने की आवश्यकता नहीं है ( __init__) हर बार जब आप एक स्क्रैप स्पाइडर को कोड करना चाहते हैं, तो आप पहले की तरह पैरामीटर निर्दिष्ट कर सकते हैं:

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

और अपने मकड़ी कोड में आप बस मकड़ी के तर्कों के रूप में उनका उपयोग कर सकते हैं:

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

और यह सिर्फ काम करता है।


4
सच। अजगर के अंधेरे पक्ष में प्रवेश करें।
बार्नी

14

क्रॉल कमांड के साथ तर्क पारित करने के लिए

मैला-कुचैला क्रॉल myspider -a श्रेणी = 'mycategory' -a डोमेन = 'example.com'

Scrapyd पर चलाने के लिए की जगह तर्क पास करने के लिए -एक साथ -d

curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d श्रेणी = 'mycategory' -d डोमेन = 'example.com'

मकड़ी को इसके निर्माता में तर्क प्राप्त होंगे।


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

Scrapy मकड़ी विशेषताओं के रूप में सभी तर्कों डालता है और आप को छोड़ सकते हैं init विधि पूरी तरह से। उन विशेषताओं को प्राप्त करने के लिए बटरेट विधि का उपयोग करें ताकि आपका कोड न टूटे


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')

रसीला, मजबूत और लचीला!
nealmcb

8

-A विकल्प का उपयोग करके क्रॉल कमांड चलाते समय स्पाइडर तर्क पारित किए जाते हैं। उदाहरण के लिए अगर मैं अपने मकड़ी के तर्क के रूप में एक डोमेन नाम पास करना चाहता हूं तो मैं यह करूंगा-

मैला-कुचैला क्रॉल myspider -a डोमेन = "http://www.example.com"

और मकड़ी के निर्माणकर्ताओं में तर्क प्राप्त करें:

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

...

यह काम करेगा :)


0

वैकल्पिक रूप से हम ScrapyD का उपयोग कर सकते हैं जो एक एपीआई को उजागर करता है जहां हम start_url और स्पाइडर नाम पारित कर सकते हैं। स्क्रेपीडी में मकड़ियों को रोकने / शुरू करने / स्थिति / सूची बनाने के लिए एपीआई है।

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deployअंडे के रूप में मकड़ी को डेमॉन में तैनात करेगा और यहां तक ​​कि यह मकड़ी के संस्करण को बनाए रखेगा। मकड़ी को शुरू करते समय आप बता सकते हैं कि मकड़ी के किस संस्करण का उपयोग करना है।

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

अतिरिक्त लाभ यह है कि आप अपने स्वयं के UI का निर्माण उपयोगकर्ता से url और अन्य पैरामेट्स को स्वीकार करने के लिए कर सकते हैं और उपरोक्त स्क्रैपबुक शेड्यूल लिंक का उपयोग करके किसी कार्य को शेड्यूल कर सकते हैं

देखें scrapyd API दस्तावेज़ अधिक जानकारी के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.