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?
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. –