2018-10-30
Scrapy框架中Pipeline用法
当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理
每个item pipeline组件是实现了简单的方法的python类,负责接收到item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或者被丢弃而不再进行处理
item pipeline的主要作用:
清理html数据
验证爬取的数据
去重并丢弃
讲爬取的结果保存到数据库中或文件中
自己编写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配置文件中的信息
自己编写了TextPipeline和MongoPipeLine
TextPipeline:用来出来返回的Item,对Item[‘text’]进行长度限制
MongoPipeline:将数据插入到MongoDB中,同时,也演示了from_crawler如何从settings中回去配置数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import pymongofrom scrapy.exceptions import DropItemclass TextPipeline (object) : def __init__ (self) : self.limit=50 def process_item (self, item, spider) : if item['text' ]: if len(item['text' ])>self.limit: item['text' ] = item['text' ][0 :self.limit].rstrip()+'...' return item['text' ] else : return DropItem('Missing Text' ) class MongoPipeLine (object) : 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.setting.get('MONGO_URI' ), mongo_db = crawler.setting.get('MONGO_DB' ) ) def open_spider (self,spider) : self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] def process_item (self,item,spider) : name = item.__class__.__name__ self.db[name].insert(dict(item)) return item def close_spider (self,spider) : self.client.close()
启用一个item Pipeline组件
1 2 3 4 5 6 7 ITEM_PIPELINES = { 'quote.pipelines.TextPipeline' : 300 , 'quote.pipelines.MongoPipeline' : 400 , }
每个pipeline后面有一个数值,这个数组的范围是0-1000,这个数值确定了他们的运行顺序,数字越小优先级遇高
Y's Blog