我目前正在完成一个 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'.

提前谢谢了!

最佳答案

当你开始一个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



您的 settings.py 将包含如下内容:
ITEM_PIPELINES = {
    'multipipeline.pipelines.one.MyPipelineOne': 100,
    'multipipeline.pipelines.two.MyPipelineTwo': 200,
    'multipipeline.pipelines.three.MyPipelineThree': 300,
}

关于python - 用于分离文件夹/文件的 Scrapy 管道 - 抽象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44302127/

10-12 23:30