同一Scrapy项目下不同Spider配置独立Item Pipeline的方案问询
方案1:在Pipeline内部根据Spider名称区分处理逻辑
适合两个Spider的Item处理逻辑差异不大的场景,无需拆分多个Pipeline:
- 先确认两个Spider设置了唯一的
name属性,例如分别为spider_a和spider_b - 在Pipeline的
process_item方法中按Spider名称走分支逻辑:
from itemadapter import ItemAdapter class CustomPipeline: def process_item(self, item, spider): # 针对spider_a的处理逻辑,例:存入MySQL if spider.name == "spider_a": adapter = ItemAdapter(item) # 此处写你的存储/清洗逻辑 return item # 针对spider_b的处理逻辑,例:存入MongoDB elif spider.name == "spider_b": adapter = ItemAdapter(item) # 此处写你的存储/清洗逻辑 return item # 其他Spider默认不额外处理直接返回 return item
- 最后在全局
settings.py中开启该Pipeline即可:
ITEM_PIPELINES = { '你的项目名.pipelines.CustomPipeline': 300, }
方案2:为每个Spider单独指定专属Pipeline
适合两个Spider的Item处理逻辑完全独立的场景,实现规则完全隔离:
- 先在
pipelines.py中编写两个独立的Pipeline,分别对应两个Spider的需求:
# pipelines.py class SpiderAPipeline: def process_item(self, item, spider): # 仅适配Spider A的处理逻辑 # ... return item class SpiderBPipeline: def process_item(self, item, spider): # 仅适配Spider B的处理逻辑 # ... return item
- 在各自的Spider类中通过custom_settings属性单独配置专属Pipeline,该配置优先级高于全局
settings.py:
# 第一个Spider文件 spider_a.py import scrapy class SpiderA(scrapy.Spider): name = "spider_a" # 单独配置该Spider的Pipeline,会覆盖全局配置 custom_settings = { 'ITEM_PIPELINES': { '你的项目名.pipelines.SpiderAPipeline': 300, } } def start_requests(self): # 你的爬取逻辑 pass
# 第二个Spider文件 spider_b.py import scrapy class SpiderB(scrapy.Spider): name = "spider_b" custom_settings = { 'ITEM_PIPELINES': { '你的项目名.pipelines.SpiderBPipeline': 300, } } def start_requests(self): # 你的爬取逻辑 pass
- 该方案不需要在全局
settings.py中开启上述两个Pipeline,每个Spider运行时只会加载自己配置的Pipeline,不会互相干扰。
注意事项
- 同一个Spider可以配置多个Pipeline,按照配置的数值从小到大执行,数值越小优先级越高。
- 若需要叠加全局
settings.py配置的公共Pipeline,可以在custom_settings的ITEM_PIPELINES里把需要的公共Pipeline也加入配置列表即可。
内容的提问来源于stack exchange,提问作者Bert Cafecito
相关产品推荐
相关产品推荐

