2012-12-28 14 views
17

से स्केपर सेटिंग्स तक कैसे पहुंचे I आइटम पाइपलाइन से settings.py में स्केच सेटिंग्स का उपयोग कैसे करूं। दस्तावेज का उल्लेख है कि इसे विस्तार में क्रॉलर के माध्यम से एक्सेस किया जा सकता है, लेकिन मुझे नहीं लगता कि पाइपलाइनों में क्रॉलर तक कैसे पहुंचे।आइटम पाइपलाइन

उत्तर

19

ठीक है, तो http://doc.scrapy.org/en/latest/topics/extensions.html पर दस्तावेज़ कहते हैं

The main entry point for a Scrapy extension (this also includes middlewares and pipelines) is the from_crawler class method which receives a Crawler instance which is the main object controlling the Scrapy crawler. Through that object you can access settings, signals, stats, and also control the crawler behaviour, if your extension needs to such thing.

तो फिर आप सेटिंग प्राप्त करने के एक समारोह हो सकता है।

@classmethod 
def from_crawler(cls, crawler): 
    settings = crawler.settings 
    my_setting = settings.get("MY_SETTING") 
    return cls(my_setting) 

क्रॉलर इंजन तो my_setting साथ पाइप लाइन के init फ़ंक्शन को कॉल करने, इसलिए जैसे:

def __init__(self, my_setting): 
    self.my_setting = my_setting 

और अन्य कार्यों, self.my_setting के साथ उपयोग कर सकते हैं के रूप में उम्मीद।

वैकल्पिक रूप से, from_crawler() समारोह में आप crawler.settings वस्तु __init__() के लिए उपयोग सेटिंग्स पाइप लाइन से के रूप में के बजाय निर्माता में उन सब को बाहर खींच की जरूरत पारित कर सकते हैं, और उसके बाद।

+0

कि बहुत जटिल लग। ऐसा करने का कोई आसान तरीका नहीं है, या शायद एक बेहतर स्पष्टीकरण? क्या आप 'scrapy.settings आयात सेटिंग्स' से उपयोग नहीं कर सकते? – not2qubit

+1

@ user1147688 मैं इस विधि का उपयोग करता हूं, क्योंकि यह निर्भरता-इंजेक्शन आधारित स्कीपर के आंतरिक एपीआई के अनुरूप है। आपका सुझाव काम कर सकता है, लेकिन ऐसा लगता है कि भविष्य में यह जारी रहेगा कि आंतरिक एपीआई को स्थानांतरित किया जा सकता है। – deceze

+0

@avaleske, यह कमाल काम करता है, हालांकि क्या आप जानते हैं कि हम सेटिंग सेट करने के लिए इसका उपयोग कैसे कर सकते हैं? उदाहरण के लिए, किसी अन्य फ़ंक्शन में, मैं कहता हूं कि मैं सेटिंग मानों में से एक को बदलना चाहता हूं, जैसे 'download_delay'। क्या हम वह कर सकते हैं? – thefoxrocks

18

your_spider.py के भीतर से आपकी स्कैर सेटिंग्स (settings.py में परिभाषित) तक पहुंचने का तरीका सरल है। अन्य सभी उत्तर रास्ता बहुत जटिल हैं। इसका कारण स्केपर प्रलेखन का बहुत खराब रखरखाव है, कई हालिया अपडेट & परिवर्तनों के साथ संयुक्त है। न तो "सेटिंग्स" दस्तावेज़ में "How to access settings", न ही "Settings API" में उन्होंने किसी भी व्यावहारिक उदाहरण को परेशान किया है। यहां एक उदाहरण दिया गया है, अपना वर्तमान यूएसER_AGENT स्ट्रिंग कैसे प्राप्त करें।

बस your_spider.py निम्न पंक्तियां जोड़ें:

# To get your settings from (settings.py): 
from scrapy.utils.project import get_project_settings 
... 
class YourSpider(BaseSpider): 
    ... 
    def parse(self, response): 
     ... 
     settings = get_project_settings() 
     print "Your USER_AGENT is:\n%s" % (settings.get('USER_AGENT')) 
     ... 

जैसा कि आप देख सकते हैं, वहाँ @classmethod उपयोग करने के लिए या from_crawler() या __init__() कार्यों फिर से परिभाषित आवश्यकता नहीं है। उम्मीद है की यह मदद करेगा।

पीएस। मुझे अभी भी यकीन नहीं है कि from scrapy.settings import Settings का उपयोग क्यों नहीं किया जाता है, क्योंकि यह आयात की अधिक स्पष्ट पसंद होगी?

+0

दस्तावेज़ीकरण के बावजूद @avaleske का उपयोग करने वाली विधि का सुझाव है कि मैं अभी भी इस तरह से पसंद करता हूं क्योंकि यह काम करता है और समझने के लिए तेज़ है। –

+3

यह विधि ** ** उन सेटिंग्स को पहचान नहीं रही थी जो [कमांड लाइन से ओवरराइड किए गए थे] (http://doc.scrapy.org/en/0.24/topics/settings.html#command-line- विकल्प)। यदि आप इस कार्यक्षमता को चाहते हैं तो @ avaleske के उत्तर का प्रयोग करें। –

13

सही उत्तर यह है: यह इस बात पर निर्भर करता है कि उस पाइपलाइन में जहां आप सेटिंग्स तक पहुंच बनाना चाहते हैं।

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

class PipelineX(object): 

    def process_item(self, item, spider): 
     wanted_setting = spider.settings.get('WANTED_SETTING') 
+1

ग्रेट उत्तर। मेरे प्रोजेक्ट के लिए तर्क को 'open_spider' विधि में डालने के लिए और अधिक समझदारी हुई क्योंकि जब स्पाइडर पहले लोड होता है तो मैं केवल उस मान का उपयोग करता हूं। –

2

परियोजना संरचना काफी सपाट है, क्यों नहीं:

# pipeline.py 
from myproject import settings 
संबंधित मुद्दे