2013-04-05 20 views
12

Ich bin neu in Scrapy und arbeite an einer Scraping-Übung und ich benutze den CrawlSpider. Obwohl das Scrapy-Framework wunderbar funktioniert und den relevanten Links folgt, kann ich den CrawlSpider nicht dazu bringen, den allerersten Link (die Homepage/Zielseite) zu scrappen. Stattdessen wird direkt auf die durch die Regel bestimmten Links geschaut, aber nicht auf die Zielseite, auf der sich die Links befinden. Ich weiß nicht, wie ich das beheben kann, da es nicht empfohlen wird, die Parse-Methode für einen CrawlSpider zu überschreiben. Das Ändern von follow = True/False liefert ebenfalls keine guten Ergebnisse. Hier ist der Code-Snippet:Scrapy CrawlSpider crawlt nicht die erste Zielseite

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

Sie falsch geschrieben 'allow' Argument – webKnjaZ

Antwort

16

einfach Ihren Rückruf parse_start_url ändern und überschreiben Sie es:

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

Ja. Das hat es behoben. Vielen Dank ! – gpanterov

12

Es gibt eine Reihe von Möglichkeiten, dies zu tun, aber eine der einfachsten ist parse_start_url zu implementieren und ändern 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

Danke. Dies behebt das Problem. – gpanterov

+1

Funktioniert es immer noch, wenn Sie nicht parse_start_url aufrufen? Wenn ja, wann wird parse_start_url aufgerufen? –

Verwandte Themen