Scrapy 多个item对应一个pipeline

背景

​ 在利用Scrapy编写爬虫时,经常会遇到同一个爬虫中包含多个item classes, 并且需要在同一个pipelines.py中根据不同的item classes进行逻辑的处理。

需求: 数据需要同时发送到ElasticSearch以及Redis, 唯一的区别就是item classes,不同。发送到Redis的数据是标准化之后的数据, 发送到ElasticSearch是原始的数据。

解决方法: 这里可以通过isinstance来进行区分。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html


from tb.items import RedisItem
from tb.items import ElasticSearchItem

class RedisPipeline(object):
def process_item(self, item, spider):
if isinstance(item, RedisItem):
# to do something
return item

class ElasticPipeline(object):
def process_item(self, item, spider):
if isinstance(item, ElasticSearchItem):
# to do something
return item

参考