Scrapy管道分离文件夹/文件 - 抽象

时间:2017-06-01 08:17:12

标签: python scrapy scrapy-pipeline

我目前正在完成一个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中,然后从中获取参考。我在__init__.py目录中添加了一个空myPipelines,然后添加了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'.

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

当你开始一个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模块转换为其自己的目录中的包。 请注意__init__.py目录中的pipelines/文件:

$ 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对待   目录包含包;这是为了防止   无意中具有通用名称的目录,例如string   隐藏稍后在模块搜索路径上发生的有效模块。在   最简单的情况,__init__.py可以只是一个空文件,但它可以   还执行包的初始化代码或设置__all__   变量,稍后描述。

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

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