2013-04-05 18 views
12

私はScrapyを初めて使用しています。私はスクレイピング練習に取り組んでおり、CrawlSpiderを使用しています。 Scrapyフレームワークは美しく機能し、関連リンクをたどっていますが、CrawlSpiderが最初のリンク(ホームページ/リンク先ページ)を削ってしまうようなことはありません。代わりに、それはルールによって決定されたリンクを掻き取るために直接行くが、リンクがあるランディングページを掻き取ることはない。 CrawlSpiderの解析メソッドを上書きすることは推奨されていないため、これを修正する方法はわかりません。 follow = True/Falseを変更しても良い結果は得られません。ここでは、コードの抜粋です。これを行うには、いくつかの方法がありますScrapy CrawlSpiderは最初のランディングページをクロールしません

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'引数のスペルを間違えています – 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はいつ呼ばれますか? –