2012-06-20 12 views
5

पार्सिंग के विभिन्न स्तरों पर आइटम तक कैसे पहुंचे I मैं एक वेबसाइट (केवल दो स्तरों को गहरा) क्रॉल कर रहा हूं, और मैं दोनों स्तरों पर साइटों से जानकारी को स्क्रैप करना चाहता हूं। जिस समस्या में मैं दौड़ रहा हूं, क्या मैं एक स्तर के फ़ील्ड को दोनों स्तरों से जानकारी के साथ भरना चाहता हूं। मैं यह कैसे करु?स्क्रैप क्रॉलस्पीडर:

मैं एक उदाहरण चर के रूप में वस्तुओं की एक सूची रखने के बारे में सोच रहा था जो सभी धागे (क्योंकि यह मकड़ी का एक ही उदाहरण है) के माध्यम से सुलभ होगा, और parse_1 कुछ फ़ील्ड भर देगा, और parse_2 को जांचना होगा संबंधित मान भरने से पहले सही कुंजी। यह विधि बोझिल लगती है, और मुझे अभी भी यकीन नहीं है कि इसे कैसे काम करना है।

मैं क्या सोच रहा हूं कि एक बेहतर तरीका होना चाहिए, शायद किसी भी तरह से कॉलबैक में किसी आइटम को पास करना। मुझे नहीं पता कि अनुरोध() विधि के साथ ऐसा कैसे करें। विचार?

कुछ मामलों आप उन कॉलबैक कार्यों के लिए तर्क गुजर ताकि आप तर्क बाद में प्राप्त कर सकते हैं दूसरा कॉलबैक में, में रुचि हो सकती है:

उत्तर

8
scrapy प्रलेखन से

। आप इसके लिए Request.meta विशेषता का उपयोग कर सकते हैं।

def parse_page1(self, response): 
    item = MyItem() 
    item['main_url'] = response.url 
    request = Request("http://www.example.com/some_page.html", 
         callback=self.parse_page2) 
    request.meta['item'] = item 
    return request 

def parse_page2(self, response): 
    item = response.meta['item'] 
    item['other_url'] = response.url 
    return item 

तो, मूल रूप से आप एक प्रथम पृष्ठ स्क्रैप और आइटम में सभी जानकारी स्टोर और फिर पूरे भेज सकते हैं:

यहाँ कैसे इस तंत्र का उपयोग करते हुए, विभिन्न पृष्ठों से अलग खानों को भरने के लिए एक आइटम पारित करने के लिए का एक उदाहरण है उस दूसरे स्तर के यूआरएल के अनुरोध के साथ आइटम और एक ही आइटम में सभी जानकारी है।

+0

मैं यूआरएल में जानकारी चिपकाकर ऐसा करता था। इस तरह बेहतर लगता है, खासकर उन वस्तुओं के लिए जो यूआरएल में अच्छी तरह से एन्कोड नहीं करते हैं। धन्यवाद! – Muhd

+1

यदि मेरे पास दो पृष्ठ हैं - पृष्ठ 2 और पृष्ठ 3 - जिसमें जानकारी के कुछ हिस्सों को भरने के लिए भी हैं, तो मैं उन्हें दो अलग-अलग स्क्रैप में अनुक्रमिक रूप से कैसे कॉल कर सकता हूं। अनुरोध? मैं दोनों को 'मेटा' में आधे भरे हुए आइटम को पास कर सकता हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि अंतिम 'आइटम' में पृष्ठ 1 + पृष्ठ 2 + पृष्ठ 3 से डेटा है - सभी एक साथ – dowjones123

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