当 Item 在 Spider 中被收集之后,就会被传递到 Item Pipeline 中进行处理
每个 item pipeline 组件是实现了简单的方法的 python 类,负责接收到 item 并通过它执行一些行为,同时也决定此 Item 是否继续通过 pipeline, 或者被丢弃而不再进行处理
item pipeline 的主要作用:
process_item(self,item,spider)
每个 item piple 组件是一个独立的 pyhton 类,必须实现以 process_item(self,item,spider) 方法
每个 item pipeline 组件都需要调用该方法,这个方法必须返回一个具有数据的 dict, 或者 item 对象,或者抛出 DropItem 异常,被丢弃的 item 将不会被之后的 pipeline 组件所处理
open_spider(self,spider)
表示当 spider 被开启的时候调用这个方法
close_spider(self,spider)
当 spider 挂去年比时候这个方法被调用
from_crawler(cls,crawler)
这个和我们在前面说 spider 的时候的用法是一样的,可以用于获取 settings 配置文件中的信息,需要注意的这个是一个类方法,用法例子如下:
例子 1
这个例子实现的是判断 item 中是否包含 price 以及 price_excludes_vat,如果存在则调整了 price 属性,都让 item['price'] = item['price'] * self.vat_factor,如果不存在则返回 DropItem
- from scrapy.exceptions import DropItem
- class PricePipeline(object) :
- vat_factor = 1.15
- def process_item(self, item, spider) : if item['price'] : if item['price_excludes_vat'] : item['price'] = item['price'] * self.vat_factor
- return item
- else: raise DropItem("Missing price in %s" % item)
例子 2
这个例子是将 item 写入到 json 文件中
- import json
- class JsonWriterPipeline(object) :
- def __init__(self) : self.file = open('items.jl', 'wb')
- def process_item(self, item, spider) : line = json.dumps(dict(item)) + "\n"self.file.write(line) return item
例子 3
将 item 写入到 MongoDB,同时这里演示了 from_crawler 的用法
- import pymongo
- class MongoPipeline(object) :
- collection_name = 'scrapy_items'
- def __init__(self, mongo_uri, mongo_db) : self.mongo_uri = mongo_uri self.mongo_db = mongo_db
- @classmethod def from_crawler(cls, crawler) : return cls(mongo_uri = crawler.settings.get('MONGO_URI'), mongo_db = crawler.settings.get('MONGO_DATABASE', 'items'))
- def open_spider(self, spider) : self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db]
- def close_spider(self, spider) : self.client.close()
- def process_item(self, item, spider) : self.db[self.collection_name].insert(dict(item)) return item
例子 4:去重
一个用于去重的过滤器,丢弃那些已经被处理过的 item, 假设 item 有一个唯一的 id,但是我们 spider 返回的多个 item 中包含了相同的 id, 去重方法如下:这里初始化了一个集合,每次判断 id 是否在集合中已经存在,从而做到去重的功能
- from scrapy.exceptions import DropItem
- class DuplicatesPipeline(object) :
- def __init__(self) : self.ids_seen = set()
- def process_item(self, item, spider) : if item['id'] in self.ids_seen: raise DropItem("Duplicate item found: %s" % item)
- else: self.ids_seen.add(item['id']) return item
在 settings 配置文件中 y9ou 一个 ITEM_PIPELINES 的配置参数,例子如下:
- ITEM_PIPELINES = {
- 'myproject.pipelines.PricePipeline': 300,
- 'myproject.pipelines.JsonWriterPipeline': 800,
- }
每个 pipeline 后面有一个数值,这个数组的范围是 0-1000,这个数值确定了他们的运行顺序,数字越小越优先
来源: http://www.cnblogs.com/zhaof/p/7196197.html