items

爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy spider可以以python的dict来返回提取的数据.虽然dict很方便,并且用起来也熟悉,但是其缺少结构性,容易打错字段的名字或者返回不一致的数据,尤其在具有多个spider的大项目中。。

为了定义常用的输出数据,Scrapy提供了 Item 类。 Item 对象是种简单的容器,保存了爬取到得数据。 其提供了 类似于词典(dictionary-like) 的API以及用于声明可用字段的简单语法。

许多Scrapy组件使用了Item提供的额外信息: exporter根据Item声明的字段来导出数据、 序列化可以通过Item字段的元数据(metadata)来定义、 trackref 追踪Item实例来帮助寻找内存泄露 (see 使用 trackref 调试内存泄露) 等等。

声明Item

import scrapy


class Billboard100Item(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    artist = scrapy.Field()
    cover = scrapy.Field()
    week_of =scrapy.Field()
    current_week = scrapy.Field()
    last_week = scrapy.Field()
    peak_position = scrapy.Field()
    weeks_on_chart = scrapy.Field()
    pass

使用Item

import scrapy

from billboard100.items import Billboard100Item

class Billboard100Spider(scrapy.Spider):
    name = 'billboard100'
    allowed_domains = ['billboard.com']
    start_urls = [
        'http://www.billboard.com/charts/hot-100'
    ]
    def parse(self,response):
        for sel in response.xpath('//article[@data-songtitle]'):
            item= Billboard100Item()
            item['title'] = sel.xpath('div[1]/div[@class="chart-row__main-display"]//h2[@class="chart-row__song"]/text()').extract()
            item['artist'] = sel.xpath('div[1]/div[@class="chart-row__main-display"]/div[@class="chart-row__container"]/div//*[@class="chart-row__artist"]/text()').extract()
            item['cover'] = sel.xpath('div[1]/div[@class="chart-row__main-display"]//div[@class="chart-row__image"]/@style | div[1]/div[@class="chart-row__main-display"]//div[@class="chart-row__image"]/@data-imagesrc ').extract()
            item['current_week']=sel.xpath('div[1]/div[@class="chart-row__main-display"]//span[@class="chart-row__current-week"]/text()').extract()
            item['last_week']=sel.xpath('div[2]/div[1]/div[1]/span[2]/text()').extract()
            item['weeks_on_chart']=sel.xpath('div[2]/div[1]/div[3]/span[2]/text()').extract()
            item['peak_position']=sel.xpath('div[2]/div[1]/div[2]/span[2]/text()').extract()
            item['week_of'] = response.xpath('//time/text()').extract()
            yield item



##保存爬到的数据

scrapy crawl -o items.json