2013-04-05 16 views
12

Scrapy konusunda yeniyim ve bir kazıma alıştırması üzerinde çalışıyorum ve CrawlSpider'ı kullanıyorum. Scrapy çerçevesi güzel çalışıyor ve ilgili bağlantıları izlese de, CrawlSpider'ı ilk bağlantıyı (ana sayfa/açılış sayfası) taramak için yapamıyorum. Bunun yerine, kural tarafından belirlenen bağlantıları kazımak için doğrudan doğruya gider, ancak bağlantıların olduğu açılış sayfasını kazımaz. Bir CrawlSpider için ayrıştırma yönteminin üzerine yazılması önerilmez, çünkü bunu nasıl düzeltebilirim bilmiyorum. Follow = True/False 'i değiştirmek de iyi sonuç vermez. İşte kod snippet'idir: Bunu yapmanın çeşitli yolları vardırScrapy CrawlSpider ilk açılış sayfasını taramıyor

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

'allow' argümanı yanlış yazıyorsunuz – webKnjaZ

cevap

16

Sadece parse_start_url için geri arama değiştirmek değiştirmek ve etmektir geçersiz kılma:

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

Yep. Bu düzeltildi. Teşekkürler ! – gpanterov

12

ancak en basit biri parse_start_url uygulamak ve daha sonra 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

Teşekkürler. Bu sorunu çözdü. – gpanterov

+1

Parse_start_url'u geri aramıyorsanız hala çalışıyor mu? Eğer öyleyse parse_start_url ne zaman denir? –