2015-03-01 25 views
5

İki temel örümcek, yani SitemapSpider ve CrawlSpider'ın işlevselliğini devralan bir örümcek yaratmak mümkün mü?Terapi örümceklerinde çoklu kalıtım

Çeşitli sitelerden verileri kazımaya çalışıyorum ve tüm sitelerin Web sitesinde her sayfanın listelenmediğini, dolayısıyla CrawlSpider'ı kullanmanın gerekmediğini fark ettim. Ancak CrawlSpider, birçok gereksiz sayfadan geçiyor ve bir çeşit overkill.

  1. SitemapSpider bir alt sınıfı olan benim Örümcek başlatın ve kullanışlı bilgi yöntemi ayıklamak parse_products için normal ifade eşleşti yanıtları geçmesi

    : Ben yapmak istiyorum ne

    böyle bir şeydir.

  2. Regex ile eşleşen bağlantılara gidin:/reviews/ürünler sayfasından, ve verileri parse_review işlevine gönderin.
    Not: "/ yorum /" tip sayfalar site haritasında

  3. Özü

  4. CrawlSpider özyinelemeli taramaların için temelde yorumlar/sayfa/bilgi ve kazıma listelenmeyen

------- EK DETAYLAR -------

Söz konusu sitenin adresi www.flipkart.com The s Her sayfanın kendi ayrıntı sayfasına sahip olduğu birçok ürün için listeleme vardır. Ayrıntı sayfası ile birlikte, ürün için ilgili "gözden geçirme" sayfasıdır. İnceleme sayfasına bağlantı, ürün ayrıntıları sayfasında da mevcuttur.

Not: Sayfaları inceleme, site haritasında listelenmez.

class WebCrawler(SitemapSpider, CrawlSpider): 
    name = "flipkart" 
    allowed_domains = ['flipkart.com'] 
    sitemap_urls = ['http://www.flipkart.com/robots.txt'] 
    sitemap_rules = [(regex('/(.*?)/p/(.*?)'), 'parse_product')] 
    start_urls = ['http://www.flipkart.com/'] 
    rules = [Rule(LinkExtractor(allow=['/(.*?)/product-reviews/(.*?)']), 'parse_reviews'), 
      Rule(LinkExtractor(restrict_xpaths='//div[@class="fk-navigation fk-text-center tmargin10"]'), follow=True)] 

    def parse_product(self, response): 
     loader = FlipkartItemLoader(response=response) 
     loader.add_value('pid', 'value of pid') 
     loader.add_xpath('name', 'xpath to name') 
     yield loader.load_item() 

    def parse_reviews(self, response): 
     loader = ReviewItemLoader(response=response) 
     loader.add_value('pid','value of pid') 
     loader.add_xpath('review_title', 'xpath to review title') 
     loader.add_xpath('review_text', 'xpath to review text') 
     yield loader.load_item() 
+0

bir kullanım örneklerini verebilir misiniz kullanmak yield from sözdizimi yok mu? Yardım etmek için yardımcı olur. Teşekkürler. – alecxe

+1

Evet elbette, ek bilgi – Ishan070692

+0

merhaba alecxe ile düzenleyeceğim, – Ishan070692

cevap

2

Doğru yolda, geriye kalan tek şey, parse_product fonksiyonunun sonundadır, bunu

def parse_product(self, response): 
    loader = FlipkartItemLoader(response=response) 
    loader.add_value('pid', 'value of pid') 
    loader.add_xpath('name', 'xpath to name') 
    yield loader.load_item() 

    # CrawlSpider defines this method to return all scraped urls. 
    yield from self.parse(response) 

gibi tarayıcı tarafından çıkarılan tüm URL'ler verim zorunda Eğer hedef site ve almak istediğiniz istenen veriyi: o zaman sadece

for req in self.parse(response): 
    yield req 
+0

Yapabilirseniz lütfen biraz detay verin. Aslında size yardımcı olması için eksik noktaydı. Bununla birlikte, Scrapy dokümanlarındaki hiç bir şeyden bahsetmiyorum, harika olsa bile! – antoinet