1、介绍Item Pipeline
当Item在Spider中被收集之后,它将会被传递到Item Pipeline,
这些Item Pipeline组件按照定义的顺序处理Item,每一个Item Pipeline 都是实现了简单方法的Python类
Item Pipeline组件是一个独立的Python类,编写Item Pipeline时,process_item()方法必须实现
2、启用一个Item Pipeline组件
写好了pipelines.py之后,为了启用Item Pipeline组件,必需将它的类添加到setting.py文件中的ITEM_PIPELINES配置,如下:
分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过Pipeline,数字定义在1-1000之间,数值越低,组件的优先级越高。
3、完善之前的案例
不再用列表items存储item,而是将每一个item返回给引擎,引擎交给管道文件来处理每一个item。
以下用Pipeline将所有爬取到的Item,存储到一个独立的item.json文件中,每行包含一个序列化为‘Json’格式的‘item’
打开pipelines.py文件写入以下代码:
import json
class ItcastPipeline(object):
def __init__(self):
self.f = open("itcast_pipeline.json",'wb+')
#self.f = open("itcast_pipeline.json",'w')以w方式打开会出现错误。
def process_item(self, item, spider):
content = json.dumps(dict(item),ensure_ascii = False)+",\n"
self.f.write(content.encode("utf-8"))
return item #数据返回给引擎,告知此item已经处理完毕,否则会引起信号中断
def close_spider(self,spider):
self.f.close()
spiders/itcast.py文件要有稍微的改动:去掉列表items相关代码,增加 yield item,代码如下:
#RVB NMYGFVC 98Aq23 -*- coding: utf-8 -*-
import scrapy
from ITcast.items import ItcastItem #导入item
class ItcastSpider(scrapy.Spider):
#爬虫名,启动爬虫时需要的参数*必需
name = 'itcast'
#爬取域的范围,允许爬虫在这个域下进行爬取(可选)
allowed_domains = ['http://www.itcast.cn']
#起始url列表,爬虫执行后第一批请求将从这个列表获取
start_urls = ['http://www.itcast.cn/channel/teacher.shtml']
def parse(self, response):#解析响应文件
node_list = response.xpath("//div[@class='li_txt']")
for node in node_list:
#创建item字段对象,用来存储字段信息
item = ItcastItem()
#.extract()提取出xpath对象的内容部分,提取之后是个列表,需要取索引
name = node.xpath("./h3/text()").extract()
title = node.xpath("./h4/text()").extract()
info = node.xpath("./p/text()").extract()
#把信息存储到item字段中
item['name'] = name[0]
item['title'] = title[0]
item['info'] = info[0]
#返回提取到的每个item数据,给管道文件处理,同时还回来执行后面的代码即继续执行for循环
yield item