2015-03-01 14 views
5

Czy jest możliwe utworzenie pająka, który dziedziczy funkcje z dwóch podstawowych pająków, mianowicie SitemapSpider i CrawlSpider?Wielokrotne dziedziczenie pająków do scrapy

Próbowałem skrobać dane z różnych stron i zdałem sobie sprawę, że nie wszystkie witryny mają listę wszystkich stron na stronie, a więc konieczność korzystania z CrawlSpider. Ale CrawlSpider przechodzi przez wiele stron-śmieci i jest swego rodzaju przesadą.

Co chciałbym zrobić coś takiego:

  1. Zacznij moje Spider, który jest podklasą SitemapSpider i przekazać regex dopasowane odpowiedzi na parse_products wyodrębnić użyteczną metodę informacyjnego.

  2. Przejdź do łączy pasujących do wyrażenia regularnego:/reviews/ze strony produktów, i wysyłając dane do funkcji parse_review.
    Uwaga: "/ opinie /" stron typu nie są wymienione w sitemap

  3. informacji wyciąg z/opinie/stronie

  4. CrawlSpider jest w zasadzie dla rekurencyjnych indeksowań i skrobanie

------- DODATKOWE SZCZEGÓŁY -------

Strona, o której mowa, to www.flipkart.com s ite ma aukcje dla wielu produktów, z których każda strona ma własną stronę szczegółów. Wraz ze stroną ze szczegółami, ich strona odpowiada "recenzji" produktu. Link do strony recenzji jest również dostępny na stronie szczegółów produktu.

Uwaga: Strony przeglądu nie są wymienione w mapie witryny.

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

mógłbyś stanowić przypadek przykład użyć: docelowym miejscu i pożądaną dane, które chcesz dostać? Pomogłoby to. Dzięki. – alecxe

+1

tak, będę edytować moje pytanie z dodatkowymi informacjami – Ishan070692

+0

witam alecxe, Proszę podać kilka szczegółów, jeśli mógłbyś – Ishan070692

Odpowiedz

2

Jesteś na dobrej drodze, jedyne co pozostaje, to pod koniec swojej funkcji parse_product, trzeba wydajność wszystkich URL wydobyte przez robota jak tak

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) 

Jeśli nie mają składnię yield from następnie wystarczy użyć

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

W rzeczywistości dziękuję, to był brakujący punkt, aby to działało. Jednak nie widzę żadnej wzmianki o tym w dokumentach Scrapy, nawet jeśli jest świetny! – antoinet

Powiązane problemy