1.从pipeline的字典形式可以看出来,pipeline可以有多个,而且确实pipeline能够定义多个
2. 有多个爬虫,pipeline是怎样处理的呢?
首先创建三个爬虫 : 例如: 在一个scrapy的项目里面爬取三个网站: 今日头条、新浪、豆瓣
在cmd里面分别创建三个爬虫:
然后打开pycharm查看:
就会看见有三个爬虫
(1)使用pipeline处理的第一个方式可以给item加上键和响应的值: 分别再相对的爬虫py里面,的parse方法里面加上相应的键和值
1 """对应的toutiao.py""" 2 def parse(self, response): 3 item = {} 4 item["come_from"] = "toutiao" 5 pass 6 7 """对应的sina.py""" 8 def parse(self, response): 9 item = {} 10 item["come_from"] = "sina" 11 pass 12 13 """对应的douban.py""" 14 def parse(self, response): 15 item = {} 16 item["come_from"] = "douban" 17 pass
然后pipelines.py 在 process_item方法里面可以对值进行相应的操作,分别进行判断
1 class PipelinetestPipeline(object): 2 def process_item(self, item, spider): 3 if item["come_from"] == "toutiao": 4 pass 5 elif item["come_from"] == "sina": 6 pass 7 else: 8 pass 9 return item
也可以写多个类的形式进行:
1 class PipelinetestPipeline(object): 2 def process_item(self, item, spider): 3 if item["come_from"] == "toutiao": 4 pass 5 return item 6 7 8 class PipelinetestPipeline2(object): 9 def process_item(self, item, spider): 10 if item["come_from"] == "sina": 11 pass 12 return item 13 14 15 class PipelinetestPipeline3(object): 16 def process_item(self, item, spider): 17 if item["come_from"] == "douban": 18 pass
(2) 除了给item加上键和值,还有第二方式, spider.name 来进行判断,就不用给item加键和值
1 class PipelinetestPipeline(object): 2 def process_item(self, item, spider): 3 if spider.name == "toutiao": 4 pass 5 elif spider.name == "sina": 6 pass 7 else: 8 pass 9 return item
每个爬虫的类里面都有对应的name属性,也就是对应的每个爬虫的名字,所以可以利用这个属性来进行判断 然后在pipeline里面进行相应的处理
3. 对有多个爬虫时,pipeline通过上面的中方式进行处理, 一种方式是给item加上键和值,一种方式是里面name属性 分别对值或者爬虫的名字进行判断,进而对数据进行处理