2015-03-01 14 views
5

Ist es möglich, eine Spinne zu schaffen, die die Funktionalität von zwei Basisspinnen erbt, nämlich SitemapSpider und CrawlSpider?Mehrfache Vererbung in scrapy Spinnen

Ich habe versucht, Daten von verschiedenen Websites zu scrappen und erkannte, dass nicht alle Websites Auflistung jeder Seite auf der Website haben, so dass Sie CrawlSpider verwenden müssen. Aber CrawlSpider durchläuft viele unerwünschte Seiten und ist irgendwie ein Overkill.

Was würde Ich mag es, etwas zu tun, wie folgt aus:

  1. meine Spinne starten, die eine Unterklasse von SitemapSpider ist und passieren regex abgestimmt Antworten auf die parse_products nützliche Informationen Methode zu extrahieren.

  2. Gehen Sie zu Links, die mit der Regex übereinstimmen:/reviews/von der Produktseite, und senden Sie die Daten an die parse_review-Funktion.
    Hinweis: "/ reviews /" Art Seiten nicht aus/Bewertungen/Seite

  3. CrawlSpider

grundsätzlich für rekursive Crawls und Schaben

  • Extract Informationen in XML-Sitemap aufgeführten ------- ZUSÄTZLICHE DETAILS -------

    Die fragliche Seite ist www.flipkart.com Die s ite hat Auflistungen für viele Produkte, wobei jede Seite ihre eigene Detailseite hat. Zusammen mit der Detailseite gibt es eine entsprechende "Review" -Seite für das Produkt. Der Link zur Überprüfungsseite ist auch auf der Produktdetailseite verfügbar.

    Hinweis: Review-Seiten sind in der Sitemap nicht aufgeführt.

    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

    Können Sie ein Beispiel Anwendungsfall bieten: die Zielstelle und die gewünschten Daten, die Sie zu bekommen? Würde helfen zu helfen. Vielen Dank. – alecxe

    +1

    ja sicher, ich werde meine Frage mit zusätzlichen Informationen bearbeiten – Ishan070692

    +0

    Hallo Alecxe, Bitte geben Sie einige Details, wenn Sie könnten – Ishan070692

    Antwort

    2

    Sie sind auf dem richtigen Weg, das einzige, was am Ende Ihrer parse_product Funktion vorhanden ist, haben Sie alle Urls vom Crawler extrahiert zu erhalten, wie so

    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) 
    

    Wenn Sie hat die yield from Syntax nicht verwenden Sie dann nur

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

    Eigentlich danke, es war der fehlende Punkt, um es zum Funktionieren zu bringen. Allerdings sehe ich in Scrapy Docs keine Erwähnung davon, obwohl es großartig ist! – antoinet