ImportError:没有名为scrapyproject.settings的模块

时间:2016-09-10 07:54:08

标签: python scrapy scrapy-spider

我有一个scrapy项目,想法是执行爬虫并获得结果。我使用Flask作为api end应用程序并使用virtualenvironment。

from scrapy.spiderloader import SpiderLoader
from scrapy.utils.project import get_project_settings

@app.route("/")
def hello():
    settings = get_project_settings()
    loader = SpiderLoader(settings)
    spiders = loader.list()
    // validate spider
    cmd = "scrapy crawl test --nolog --output-format=json -o -"
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
    output = proc.stdout.read()
    return Response(output, mimetype='application/json')

问题是当在执行子流程

中使用下面的行时
settings = get_project_settings()
loader = SpiderLoader(settings)
spiders = loader.list()

结果为空并且抛出异常

Traceback (most recent call last):
  File "/var/www/projects/ENV/bin/scrapy", line 11, in <module>
    sys.exit(execute())
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/cmdline.py", line 108, in execute
    settings = get_project_settings()
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/utils/project.py", line 60, in get_project_settings
    settings.setmodule(settings_module_path, priority='project')
  File "/var/www/projects/ENV/local/lib/python2.7/site-packages/scrapy/settings/__init__.py", line 282, in setmodule
    module = import_module(module)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named scrapyproject.settings

当获取蜘蛛列表的代码被注释时,它会毫无问题地执行测试蜘蛛。

值得注意的是,获取所有蜘蛛的代码运行良好。

@app.route("/spiders")
def spiders():
    settings = get_project_settings()
    loader = SpiderLoader(settings)
    jsonify(loader.list())

我还研究了几个问题/答案,提到它可能是virtualenvironment的问题。但是想知道为什么它只在某些代码被执行时表现出来。

如果您想知道为什么我没有使用/执行scrapy via script。我需要的是获取输出而不保存到任何文件系统或db或任何通过管道。

1 个答案:

答案 0 :(得分:0)

提到

Christopher Davis将环境副本传递给子进程。

proc = subprocess.Popen(..., env=os.environ.copy())

在调用SCRAPY_SETTINGS_MODULE后,实际上开始注意get_project_settings()的引入,这反过来在运行执行scrapy的命令时感觉它已被加载。但不是真的装。

因此解决方案是将环境变量删除为

del os.environ['SCRAPY_SETTINGS_MODULE']
在调用子进程之前

希望能帮助别人并节省时间。

谢谢