Scrapy Ruel LinkExtractor下一页

时间:2016-05-12 05:41:14

标签: python web-scraping scrapy scrapy-spider

我正在构建一个Spider,它遍历几个分页页面并从站点中提取数据: http://www.usnews.com/education/best-global-universities/neuroscience-behavior

这是蜘蛛:

# -*- 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

遍历分页的规则似乎没有做任何事情,因为代码只是吐出第一个站点的数据。如何正确实施规则,以便蜘蛛遍历所有15个页面并从站点中提取4个项目(名称,位置,排名,分数)?

2 个答案:

答案 0 :(得分:0)

看起来它可能与文档中的here警告有关。具体来说:您撰写的Rule将回调定义为parse,但警告明确表示要避免这样做,因为如果parse方法被覆盖(因为您有)在蜘蛛中完成,蜘蛛将不再起作用。

他们在文档中举例说明了如何定义要使用的自定义回调(基本上只是不要将其命名为parse)。

此外,为了确保,我认为当您实际运行此操作时,您取消注释Rule,因为它目前已注释并且不会在您的代码中运行帐。

答案 1 :(得分:0)

将callback ='parse'更改为callback ='parse_start_url',因为Crawlspider Class默认具有解析方法,因此请避免重复使用它。