【问题标题】:Python Scrapy - Direct spider to specific PipelinePython Scrapy - 将蜘蛛引导到特定的管道
【发布时间】:2013-08-04 19:34:47
【问题描述】:

我有一个包含多个蜘蛛和多个管道的 Scrapy 项目。有没有办法告诉蜘蛛 A 使用管道 A 等???

我的 pipelines.py 有多个管道类,每个类都做不同的事情,我希望能够告诉蜘蛛使用特定的管道。

我没有看到任何明显的方法来查看可用的scrapy命令来做到这一点......

【问题讨论】:

标签: python-2.7 scrapy


【解决方案1】:

ITEM_PIPELINES 设置是在引擎启动期间为项目中的所有蜘蛛全局定义的。它不能即时更改每个蜘蛛。

这是你可以做的。定义应该通过管道本身的管道处理哪些蜘蛛。在管道的 process_item 方法中跳过/继续处理蜘蛛返回的项目,例如:

def process_item(self, item, spider): 
    if spider.name not in ['spider1', 'spider2']: 
        return item  

    # process item

另见:

希望对您有所帮助。

【讨论】:

  • 非常感谢您的帮助,我不确定 Spider 是否有更正式的方式来动态选择管道,但这绝对可以解决问题。
  • 是的,您还可以使用每个管道使用的蜘蛛的字典映射进行自定义设置。例如。 PIPELINE_SPIDERS={'name_of_the_pipeline': ['spider1', 'spider2'], ...}。然后在您的process_item 方法中,您可以检查设置并决定是否继续。
  • @alecxe 我为任何未来的读者所坚持的东西。最后需要做一个else: return item,否则你会得到没有太大意义的错误。 (至少我做到了)
【解决方案2】:

可以在蜘蛛类的 custom_settings 属性中指定要使用的管道:

class BookSpider(BaseSpider):
    name = "book_spider"

    custom_settings = {
        'ITEM_PIPELINES': {
            'my_app.pipelines.BookPipeline': 300,
        }
    }

    def parse(self, response):
        return

【讨论】:

  • 300这个数字是什么意思?
  • 300 是管道的顺序/优先级,决定了调用管道的顺序,类似于中间件的工作方式。当您为同一个蜘蛛有更多管道时,它会变得很有用。
猜你喜欢
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多