2013-06-10 7 views
5

मैं इस प्रश्न के लिए पायथन और स्केपर का उपयोग कर रहा हूं।मैं पृष्ठों के भीतर क्रॉल करने के लिए स्केपर का उपयोग कैसे करूं?

मैं वेबपेज एक, जो वेबपेजों बी 1 के लिए लिंक, बी 2, बी 3 की एक सूची है क्रॉल करने का प्रयास कर रहा हूँ, ... प्रत्येक बी पेज, C1, C2 एक और पृष्ठ पर एक लिंक होता है सी 3, ..., जिसमें एक छवि है।

तो, Scrapy का उपयोग कर, छद्म कोड में विचार है:

links = getlinks(A) 
for link in links: 
    B = getpage(link) 
    C = getpage(B) 
    image = getimage(C) 

हालांकि, जब Scrapy में एक से अधिक पृष्ठ पार्स करने का प्रयास मैं एक समस्या में चल रहा हूँ। यहां मेरा कोड है:

def parse(self, response): 
    hxs = HtmlXPathSelector(response) 
    links = hxs.select('...') 

    items = [] 
    for link in links: 
     item = CustomItem() 
     item['name'] = link.select('...') 
     # TODO: Somehow I need to go two pages deep and extract an image. 
     item['image'] = .... 

मैं यह करने के बारे में कैसे जाऊं?

(नोट: मेरा प्रश्न Using multiple spiders at in the project in Scrapy के समान है, लेकिन मैं अनिश्चित हूं कैसे Scrapy के अनुरोध वस्तुओं से "वापसी" मान।)

उत्तर

6

scrapy में पार्स विधि एक नया अनुरोध वापस जाने के लिए अगर आप अधिक जारी करने की आवश्यकता की जरूरत है अनुरोध (जनरेटर के साथ अच्छी तरह से काम करता है के रूप में yield का उपयोग करें)। इस अनुरोध के अंदर आप वांछित फ़ंक्शन पर कॉलबैक सेट कर सकते हैं (रिकर्सिव होने के लिए बस parse फिर से पास करें)। पृष्ठों में क्रॉल करने का तरीका है।

आप देख सकते हैं this recursive crawler उदाहरण

के रूप में अपने उदाहरण के बाद, परिवर्तन कुछ इस तरह होगा:

def parse(self, response): 
    b_pages_links = getlinks(A) 
    for link in b_pages_links: 
     yield Request(link, callback = self.visit_b_page) 

def visit_b_page(self, response): 
    url_of_c_page = ... 
    yield Request(url_of_c_page, callback = self.visit_c_page) 

def visit_c_page(self, response): 
    url_of_image = ... 
    yield Request(url_of_image, callback = self.get_image) 

def get_image(self, response): 
    item = CustomItem() 
    item['name'] = ... # get image name 
    item['image'] = ... # get image data 
    yield item 

इसके अलावा scrapy documentation और these random code snippets की जाँच करें। वे बहुत मदद कर सकते हैं :)

+0

धन्यवाद, यह कमाल है। अगर मैं 'पर्स' विधि में 'कस्टमइटम' बनाना चाहता हूं, तो क्या मैं मेटा प्रॉपर्टी का उपयोग करके इसे पास कर दूंगा? – sdasdadas

+0

इसके अलावा, मैं वस्तुओं की एक सूची ('आइटम = []') वापस करना चाहता हूं। मैं उपरोक्त का उपयोग कैसे करूं और फिर, पूरा होने पर, आइटम को सूची में जोड़ूं? – sdasdadas

+0

मकड़ी केवल एक पृष्ठ पर जाना है, डेटा निकालना और वापस लौटना है (अंतिम 'उपज वस्तु')। डेटा एकत्र करने के लिए, सभी वस्तुओं को एक सूची में डालने की तरह, आपको 'पाइपलाइनों' मॉड्यूल में एक फ़ंक्शन बनाना होगा (यह केवल एक सम्मेलन है)। [यह उदाहरण पाइपलाइन] (https://github.com/bcap/wikipedia-music/blob/master/crawler/crawler/pipelines.py) –

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