2013-04-05 8 views
12

मैं स्केपर के लिए नया हूं और मैं स्क्रैपिंग अभ्यास पर काम कर रहा हूं और मैं क्रॉलस्पीडर का उपयोग कर रहा हूं। हालांकि स्केपर ढांचा खूबसूरती से काम करता है और यह प्रासंगिक लिंक का पालन करता है, लेकिन मुझे क्रॉलस्पीडर को पहले लिंक (होम पेज/लैंडिंग पेज) को स्क्रैप करने के लिए प्रतीत नहीं होता है। इसके बजाए यह नियम द्वारा निर्धारित लिंक को सीधे स्क्रैप करने के लिए सीधे जाता है लेकिन लैंडिंग पृष्ठ को स्क्रैप नहीं करता है जिस पर लिंक हैं। मुझे नहीं पता कि इसे कैसे ठीक किया जाए क्योंकि क्रॉलस्पीडर के लिए पार्स विधि को ओवरराइट करने की अनुशंसा नहीं की जाती है। अनुवर्ती पालन = सही/गलत भी कोई अच्छा परिणाम नहीं देता है। यहाँ कोड का स्निपेट है:स्केपर क्रॉलस्पीडर पहले लैंडिंग पृष्ठ को क्रॉल नहीं करता

class DownloadSpider(CrawlSpider): 
    name = 'downloader' 
    allowed_domains = ['bnt-chemicals.de'] 
    start_urls = [ 
     "http://www.bnt-chemicals.de"   
     ] 
    rules = ( 
     Rule(SgmlLinkExtractor(aloow='prod'), callback='parse_item', follow=True), 
     ) 
    fname = 1 

    def parse_item(self, response): 
     open(str(self.fname)+ '.txt', 'a').write(response.url) 
     open(str(self.fname)+ '.txt', 'a').write(','+ str(response.meta['depth'])) 
     open(str(self.fname)+ '.txt', 'a').write('\n') 
     open(str(self.fname)+ '.txt', 'a').write(response.body) 
     open(str(self.fname)+ '.txt', 'a').write('\n') 
     self.fname = self.fname + 1 
+1

आपने 'अनुमति' तर्क – webKnjaZ

उत्तर

16

बस parse_start_url करने के लिए अपने कॉलबैक बदल सकते हैं और है इसे ओवरराइड करें:

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 

class DownloadSpider(CrawlSpider): 
    name = 'downloader' 
    allowed_domains = ['bnt-chemicals.de'] 
    start_urls = [ 
     "http://www.bnt-chemicals.de", 
    ] 
    rules = (
     Rule(SgmlLinkExtractor(allow='prod'), callback='parse_start_url', follow=True), 
    ) 
    fname = 0 

    def parse_start_url(self, response): 
     self.fname += 1 
     fname = '%s.txt' % self.fname 

     with open(fname, 'w') as f: 
      f.write('%s, %s\n' % (response.url, response.meta.get('depth', 0))) 
      f.write('%s\n' % response.body) 
+0

हाँ। यह तय है। धन्यवाद ! – gpanterov

12

इस करने के तरीके की एक संख्या है, लेकिन सबसे सरल में से एक parse_start_url लागू करने के लिए और उसके बाद संशोधित start_urls

from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.selector import HtmlXPathSelector 

class DownloadSpider(CrawlSpider): 
    name = 'downloader' 
    allowed_domains = ['bnt-chemicals.de'] 
    start_urls = ["http://www.bnt-chemicals.de/tunnel/index.htm"] 
    rules = (
     Rule(SgmlLinkExtractor(allow='prod'), callback='parse_item', follow=True), 
     ) 
    fname = 1 

    def parse_start_url(self, response): 
     return self.parse_item(response) 


    def parse_item(self, response): 
     open(str(self.fname)+ '.txt', 'a').write(response.url) 
     open(str(self.fname)+ '.txt', 'a').write(','+ str(response.meta['depth'])) 
     open(str(self.fname)+ '.txt', 'a').write('\n') 
     open(str(self.fname)+ '.txt', 'a').write(response.body) 
     open(str(self.fname)+ '.txt', 'a').write('\n') 
     self.fname = self.fname + 1 
+0

धन्यवाद गलत वर्तनी की। यह समस्या ठीक है। – gpanterov

+1

क्या यह अभी भी काम करता है यदि आप parse_start_url को कॉलबैक नहीं करते हैं? यदि ऐसा है तो parse_start_url कहलाता है? –

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