scrapy里面的piplines主要用来处理接受spider传来的数据,也就是item。
在使用piplines的时候我们应该把settings.py中的ITEMS_PIPELINES注释掉。
ITEM_PIPELINES = {
# 前面代表pipline的管道数目,后面代表优先级。(先执行谁)
'myspiderpro1.pipelines.Myspiderpro1Pipeline': 300,
'myspiderpro1.pipelines.Myspiderpro1Pipeline2': 299,
}
为了理解setting里面的内容,我们可以来看piplines.py文件
# -*- coding: utf-8 -*-
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
class Myspiderpro1Pipeline(object):
def process_item(self, item, spider):
return item
class Myspiderpro1Pipeline2(object):
def process_item(self, item, spider):
item['rank']="A"
return item
我们可以看到,'myspiderpro1.pipelines.Myspiderpro1Pipeline': 300,
里面的 myspiderpro01 代表爬虫项目的名字,piplines表示该文件夹下的pipelines文件,Myspiderpro1Pipeline 代表着第一个pipeline类,300代表距离,就是先执行那个Pipeline。在例子中,Myspiderpro1Pipeline是300,Myspiderpro1Pipeline1是299(在setting.py中设置),那么就是Myspiderpro1Pipeline1 return 的item再给Myspiderpro1Pipeline处理,就是先执行Myspiderpro1Pipeline1.
这样的设计可以使得pipelines做不同的操作。也可以让一个项目里面的多个爬虫被pipelines处理。
如下图:
class Myspiderpro1Pipeline(object):
def process_item(self, item, spider):
if spider.name=='itcast':
pass
return item
对应的spider文件:
# -*- coding: utf-8 -*-
import scrapy
import logging
logger = logging.getLogger(__name__)
class ItcastSpider(scrapy.Spider):
name = "itcast" # 爬虫名
allowed_domains = ["itcast.cn"] #允许爬取的范围
start_urls = ['http://www.itcast.cn/channel/teacher.shtml'] #最开始请求url地址
def parse(self, response):
data = response.xpath("//div[@class='tea_con']//li")
# 分组组成一个item字典
for li in data:
item1 = {}
item1['name'] = li.xpath(".//h3/text()").extract_first()
item1['title']= li.xpath('.//h4/text()').extract_first()
logger.warning(item1)
yield item1