2011-12-16 14 views
6

scraping है मैं एक CrawlSpider निम्नलिखित कुछ लिंक करने के लिए की स्थापना की और एक समाचार पत्रिका जहां हर मुद्दे के लिए लिंक निम्न URL योजना का अनुसरण कर खुरच कर दिया है:Scrapy निम्नलिखित और गैर अनुमति लिंक

http://example.com/YYYY/DDDD/index.htm YYYY जहां साल है और डीडीडीडी तीन या चार अंक अंक संख्या है।

मुझे केवल 928 के बाद समस्याएं चाहिए, और मेरे नियम नीचे दिए गए हैं। मुझे साइट से कनेक्ट करने, लिंक क्रॉल करने या वस्तुओं को निकालने में कोई समस्या नहीं है (इसलिए मैंने अपना शेष कोड शामिल नहीं किया है)। मकड़ी गैर अनुमत लिंक का पालन करने के लिए निर्धारित लगता है। यह 377, 3 9 8, और अधिक मुद्दों को खरोंच करने की कोशिश कर रहा है, और "culture.htm" और "feature.htm" लिंक का पालन करता है। यह बहुत सारी त्रुटियों को फेंकता है और यह बहुत महत्वपूर्ण नहीं है लेकिन इसके लिए डेटा की बहुत सारी सफाई की आवश्यकता है। क्या गलत हो रहा है के बारे में कोई सुझाव?

class crawlerNameSpider(CrawlSpider): 
name = 'crawler' 
allowed_domains = ["example.com"] 
start_urls = ["http://example.com/issues.htm"] 

rules = (
     Rule(SgmlLinkExtractor(allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',)), follow = True), 
     Rule(SgmlLinkExtractor(allow = ('fr[0-9].htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('eg[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('ec[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('op[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('sc[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('re[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('in[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(deny = ('culture.htm',)),), 
     Rule(SgmlLinkExtractor(deny = ('feature.htm',)),), 
    ) 

संपादित करें: मैं इस 2009, 2010, 2011 फ़ॉट एक बहुत सरल regex का उपयोग कर तय, लेकिन मैं अभी भी उत्सुक हूँ अगर किसी को कोई सुझाव है क्यों ऊपर काम नहीं करता।

उत्तर

8

आपको denySgmlLinkExtractor पर तर्क follow पर लिंक एकत्र करने की आवश्यकता है। और यदि आपको एक फ़ंक्शन parse_item पर कॉल करने की आवश्यकता नहीं है तो आपको Rule का निर्माण करने की आवश्यकता नहीं है। के रूप में मैं अपने कोड लिखने होगा:

rules = (
     Rule(SgmlLinkExtractor(
        allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',), 
        deny = ('culture\.htm', 'feature\.htm'), 
        ), 
      follow = True 
     ), 
     Rule(SgmlLinkExtractor(
       allow = (
        'fr[0-9].htm', 
        'eg[0-9]*.htm', 
        'ec[0-9]*.htm', 
        'op[0-9]*.htm', 
        'sc[0-9]*.htm', 
        're[0-9]*.htm', 
        'in[0-9]*.htm', 
        ) 
       ), 
       callback = 'parse_item', 
     ), 
    ) 

यदि यह नियम आप parse_item प्रयोग कर रहे हैं असली url प्रतिमानों है, यह यह करने के लिए सरल किया जा सकता:

Rule(SgmlLinkExtractor(
       allow = ('(fr|eg|ec|op|sc|re|in)[0-9]*\.htm',), 
       callback = 'parse_item', 
     ), 
) 
+0

बढ़िया। सहायता के लिए धन्यवाद! – Trey

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