scrapy爬虫入门-day2
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