【问题标题】:Scrapy Pipelines to Seperate Folder/Files - Abstraction用于分离文件夹/文件的 Scrapy 管道 - 抽象
【发布时间】:2017-11-02 06:47:36
【问题描述】:

我目前正在完成一个 Scrapy 项目,但是我有一个很长的 pipelines.py 文件。

我注意到在我的settings.py 中,管道显示如下(修剪):

ITEM_PIPELINES = {
     'proj.pipelines.MutatorPipeline': 200,
     'proj.pipelines.CalculatorPipeline': 300,
     'proj.pipelines.SaveToFilePipeline': 500,
}

我已经尝试了以下方法来纠正这个问题。

1.) 我创建了一个新文件/文件夹,并尝试以相同的方式从管道中引用它。

文件夹为 myPipelines/Test.py,类名称为 TestPipeline,然后在管道设置中引用为 proj.myPipelines.Test.TestPipeline': 100,

这引发了我的错误。

然后我想我可以导出模块并导入到我当前的pipelines.py 中,它会从中获取参考。我在我的myPipelines 目录中添加了一个空的__init__.py,然后添加了from myPipelines.Test import TestPipeline,但是scrapy 仍然会抛出一个错误...

Raise NameError("Module '%s' doesn't define any object named '%s'" % (module, name))
exceptions.NameError: Module 'proj.pipelines' doesn't define any object named 'TestPipeline'.

非常感谢!

【问题讨论】:

    标签: python scrapy scrapy-pipeline


    【解决方案1】:

    当你启动一个scrapy项目时,你会得到一个这样的目录树:

    $ scrapy startproject multipipeline
    $ tree
    .
    ├── multipipeline
    │   ├── __init__.py
    │   ├── items.py
    │   ├── middlewares.py
    │   ├── pipelines.py
    │   ├── settings.py
    │   └── spiders
    │       ├── example.py
    │       └── __init__.py
    └── scrapy.cfg
    

    而生成的pipelines.py 看起来像这样:

    $ cat multipipeline/pipelines.py 
    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
    
    
    class MultipipelinePipeline(object):
        def process_item(self, item, spider):
            return item
    

    但是你的 scrapy 项目可以引用任何 Python 类作为项目管道。一种选择是将生成的单文件pipelines 模块转换为它自己目录中的一个包,其中包含子模块。 注意pipelines/ 目录中的__init__.py 文件:

    $ tree
    .
    ├── multipipeline
    │   ├── __init__.py
    │   ├── items.py
    │   ├── middlewares.py
    │   ├── pipelines
    │   │   ├── __init__.py
    │   │   ├── one.py
    │   │   ├── three.py
    │   │   └── two.py
    │   ├── settings.py
    │   └── spiders
    │       ├── example.py
    │       └── __init__.py
    └── scrapy.cfg
    

    pipelines/ 目录中的各个模块可能如下所示:

    $ cat multipipeline/pipelines/two.py 
    # -*- coding: utf-8 -*-
    
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
    import logging
    
    
    logger = logging.getLogger(__name__)
    
    
    class MyPipelineTwo(object):
        def process_item(self, item, spider):
            logger.debug(self.__class__.__name__)
            return item
    

    您可以阅读more about packages here

    __init__.py 文件是让 Python 处理 包含包的目录;这样做是为了防止 无意中使用通用名称(例如字符串)的目录 隐藏稍后出现在模块搜索路径上的有效模块。在 最简单的情况,__init__.py 可以只是一个空文件,但它可以 还执行包的初始化代码或设置__all__ 变量,稍后介绍。

    您的settings.py 将包含以下内容:

    ITEM_PIPELINES = {
        'multipipeline.pipelines.one.MyPipelineOne': 100,
        'multipipeline.pipelines.two.MyPipelineTwo': 200,
        'multipipeline.pipelines.three.MyPipelineThree': 300,
    }
    

    【讨论】:

    • 正是我想要的,谢谢!这应该被标记为答案。
    猜你喜欢
    • 2020-08-05
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多