2016-05-12 10 views
-1

Ich baue eine Spinne, die durch mehrere paginierte Seiten und extrahiert Daten von der Website durchläuft: http://www.usnews.com/education/best-global-universities/neuroscience-behaviorScrapy Ruel LinkExtractor Nächste Seite

Dies ist die Spinne:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.contrib.spiders import Rule 
from scrapy.linkextractors import LinkExtractor 
from lxml import html 
from usnews.items import UsnewsItem 


class UniversitiesSpider(scrapy.Spider): 
    name = "universities" 
    allowed_domains = ["usnews.com"] 
    start_urls = (
     'http://www.usnews.com/education/best-global-universities/neuroscience-behavior/', 
     ) 

    #Rules = [ 
    #Rule(LinkExtractor(allow=(), restrict_xpaths=('.//a[@class="pager_link"]',)), callback="parse", follow= True) 
    #] 

    def parse(self, response): 
     for sel in response.xpath('.//div[@class="sep"]'): 
      item = UsnewsItem() 
      item['name'] = sel.xpath('.//h2[@class="h-taut"]/a/text()').extract() 
      item['location'] = sel.xpath('.//span[@class="t-dim t-small"]/text()').extract() 
      item['ranking'] = sel.xpath('.//div[3]/div[2]/text()').extract() 
      item['score'] = sel.xpath('.//div[@class="t-large t-strong t-constricted"]/text()').extract() 
      #print(sel.xpath('.//text()').extract() 
      yield item 

Die Regel für die Paginierung durchqueren scheint nichts zu tun, da der Code nur die Daten für die erste Seite ausspuckt. Wie kann ich die Regel korrekt implementieren, so dass die Spinne alle 15 Seiten durchläuft und die 4 Elemente (Name, Standort, Ranking, Score) von der Site extrahiert?

+0

Um 'rules' Attribut zu verwenden (wie in" Regeln ", nicht" Regeln "wie in Ihrem Code), müssen Sie' scrapy.CrawlSpider', nicht 'scrapy.Spider' ableiten. Und wie @steve in seiner Antwort sagt, solltest du die 'Parse'-Methode von' CrawlSpider' nicht neu definieren, weil dort die ganze "Magie" mit Regeln passiert. –

Antwort

0

Es sieht so aus, als könnte es sich auf die in der Dokumentation angegebene Warnung here beziehen. Genauer gesagt: Die Rule, die Sie geschrieben haben, definiert den Rückruf als parse, aber die Warnung sagt explizit, dies zu vermeiden, denn wenn die Methode parse dann überschrieben wird (wie Sie in der Spinne getan haben), wird die Spinne nicht mehr funktionieren.

Sie geben ein Beispiel in der Dokumentation über die Definition eines benutzerdefinierten Callbacks (im Grunde einfach nicht nennen parse).

Auch nur um sicher zu gehen, nehme ich an, wenn Sie das tatsächlich ausführen, kommentieren Sie die Rule, wie es derzeit kommentiert und nicht in dem Code ausgeführt wird, den Sie gepostet haben.

0

ändern Sie callback = 'parse' zu callback = 'parse_start_url', da die Crawlspider-Klasse standardmäßig eine Parse-Methode hat, also vermeiden Sie die Wiederverwendung.

Verwandte Themen