2015-03-01 13 views
5

E 'possibile creare un ragno che eredita le funzionalità di due ragni di base, vale a dire SitemapSpider e CrawlSpider?ereditarietà multipla in ragni Scrapy

mi hanno cercato di raschiare i dati provenienti da vari siti e si rese conto che non tutti i siti hanno elenco di ogni pagina del sito, in tal modo la necessità di utilizzare CrawlSpider. Ma CrawlSpider passa attraverso un sacco di pagine spazzatura e è una specie di un peso inutile.

Quello che vorrei fare è qualcosa di simile:

  1. iniziare il mio Spider, che è una sottoclasse di SitemapSpider e superare regex risposte abbinati ai parse_products per estrarre utili metodo informazioni.

  2. Passare ai collegamenti corrispondenti alla regex:/reviews/dalla pagina prodotti, e inviare i dati alla funzione parse_review.
    Nota: "/ recensioni /" pagine di tipo non sono elencati nel sito

  3. informazioni Estratto/recensioni/pagina

  4. CrawlSpider è fondamentalmente per le scansioni ricorsive e raschiando

------- DETTAGLI AGGIUNTIVI -------

Il sito in questione è www.flipkart.com s esso ha elenchi per molti prodotti, con ogni pagina che ha la sua pagina di dettaglio. Insieme con la pagina dei dettagli, la loro è una "revisione" pagina corrispondente per il prodotto. Il link alla pagina di revisione è disponibile anche nella pagina dei dettagli del prodotto.

Nota: le pagine di commento non sono elencati sul sito.

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

Potrebbe fornire un caso ad esempio l'uso: il sito di destinazione e i dati desiderati si vuole ottenere? Aiuterebbe ad aiutare Grazie. – alecxe

+1

si certo, mi permetterà di modificare la mia domanda con informazioni aggiuntive – Ishan070692

+0

ciao alecxe, Si prega di fornire alcuni dettagli se si potesse – Ishan070692

risposta

2

Siete sulla strada giusta, l'unica cosa rimasta è alla fine della funzione parse_product, si deve cedere tutti gli URL estratte dal crawler in questo modo

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) 

Se non hanno la sintassi yield from poi basta usare

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

realtà grazie, era il punto mancante per farlo funzionare. Tuttavia non vedo alcuna menzione a riguardo nei documenti Scrapy, anche se è grandioso! – antoinet

Problemi correlati