मैंने स्केपर का उपयोग करके एक मकड़ी लिखी, जो साइट्स को अलग करने के लिए HtmlXPathSelector अनुरोधों का पूरा समूह बनाता है। प्रत्येक अनुरोध (असीमित रूप से) संतुष्ट होने के बाद यह एक .csv फ़ाइल में डेटा की एक पंक्ति बनाता है। यह देखना असंभव है कि कौन सा अनुरोध आखिरी बार संतुष्ट है, क्योंकि अगर कोई डेटा निकाला नहीं गया है तो अनुरोध दोहराया जाता है (कभी-कभी यह डेटा को कुछ बार याद करता है)। भले ही मैं एक साफ सूची के साथ शुरू करता हूं, आउटपुट झुका हुआ है क्योंकि डेटा निकालने के तुरंत बाद पंक्तियां लिखी जाती हैं।स्पाइडर_क्लोज़ सिग्नल भेजे जाने से ठीक पहले पाइथन स्कैपर फ़ंक्शन को कॉल किया जाना चाहिए?
अब मैं उस सूची को एक कॉलम के आधार पर सॉर्ट करना चाहता हूं, लेकिन प्रत्येक अनुरोध के बाद। क्या वास्तविक कार्य को ट्रिगर करने के लिए 'स्पाइडर_क्लोज्ड' सिग्नल का उपयोग किया जा सकता है? नीचे दिए गए, मैंने प्रेषक के साथ सिग्नल को जोड़ने का प्रयास किया, लेकिन यह फ़ंक्शन केवल चर के साथ काम करने या अन्य कार्यों को कॉल करने के बजाय चीजों को मुद्रित करने लगता है।
def start_requests(self)
... dispatcher.connect(self.spider_closed, signal=signals.engine_stopped) ....
def spider_closed(spider):
print 'this gets printed alright' # <-only if the next line is omitted...
out = self.AnotherFunction(in) # <-This doesn't seem to run
मुझे लगता है कि आप सिग्नल में 1 से अधिक फ़ंक्शन संलग्न कर सकते हैं। क्या यह आपकी समस्या का समाधान करेगा? –
आप वास्तव में सिग्नल को एक फ़ंक्शन से जोड़ सकते हैं ... मेरा मानना है कि मेरी वास्तविक समस्या 'स्केपर' की संरचना के साथ थी - इसे पहले मकड़ी के माध्यम से चलाने के लिए एक .py फ़ाइल बनाकर हल किया गया था, और उसके बाद सॉर्ट करें आउटपुट फ़ाइल बाद में। इससे बहुत मदद मिली: http://snipplr.com/view/67012/selfcontained-script-to-crawl-a-site-updated-scrapy-130dev/ – corg
प्रेषक नहीं होना चाहिए। कनेक्ट (...) __init __ में होना चाहिए () start_requests() के बजाय? – imwilsonxu