2013-04-05 5 views
12

Sono nuovo di Scrapy e sto lavorando a un esercizio di raschiamento e sto utilizzando CrawlSpider. Sebbene il framework Scrapy funzioni magnificamente e segua i link rilevanti, non riesco a far sembrare a CrawlSpider il primo collegamento (la home page/landing page). Invece va direttamente a raschiare i collegamenti determinati dalla regola ma non raschia la pagina di destinazione su cui si trovano i collegamenti. Non so come risolvere questo problema poiché non è consigliabile sovrascrivere il metodo di analisi per un CrawlSpider. Modificando follow = True/False, inoltre, non si ottengono buoni risultati. Ecco il frammento di codice:Scrapy CrawlSpider non esegue la scansione della prima pagina di destinazione

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

Hai sbagliato l'argomento 'allow' – webKnjaZ

risposta

16

basta cambiare il callback per parse_start_url e override:

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

Sì. Questo l'ha risolto. Grazie ! – gpanterov

12

C'è un certo numero di modi di fare questo, ma uno dei più semplici è quello di implementare parse_start_url e quindi modificare 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

Grazie. Questo ha risolto il problema. – gpanterov

+1

Funziona ancora se non si chiama parse_start_url? Se è così quando viene chiamato parse_start_url? –

Problemi correlati