2013-04-05 38 views
12

Tôi mới sử dụng Scrapy và tôi đang thực hiện một bài tập cào và tôi đang sử dụng CrawlSpider. Mặc dù khung công tác Scrapy hoạt động rất đẹp và nó tuân theo các liên kết có liên quan, tôi dường như không thể làm cho CrawlSpider xóa bỏ liên kết đầu tiên (trang chủ/trang đích). Thay vào đó nó đi trực tiếp để cạo các liên kết được xác định bởi quy tắc nhưng không cạo trang đích mà trên đó các liên kết là. Tôi không biết cách khắc phục điều này vì không nên ghi đè phương thức phân tích cú pháp cho CrawlSpider. Sửa đổi follow = True/False cũng không mang lại kết quả tốt. Dưới đây là đoạn mã:Thu thập thông tin không chính xác CrawlSpider không thu thập thông tin trang đích đầu tiên

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

Bạn đã viết sai chính tả 'allow' – webKnjaZ

Trả lời

16

Chỉ cần thay đổi callback của bạn để parse_start_url và ghi đè lên:

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

Đúng. Điều này cố định nó. Cảm ơn ! – gpanterov

12

Có một số cách để làm điều này, nhưng một trong những đơn giản nhất là để thực hiện parse_start_url và sau đó sửa đổi 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

Cảm ơn. Điều này đã khắc phục được sự cố. – gpanterov

+1

Tính năng này vẫn hoạt động nếu bạn không gọi lại parse_start_url? Nếu như vậy khi được gọi là parse_start_url? –

Các vấn đề liên quan