我有一个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或任何通过管道。
答案 0 :(得分:0)
Christopher Davis将环境副本传递给子进程。
proc = subprocess.Popen(..., env=os.environ.copy())
在调用SCRAPY_SETTINGS_MODULE
后,实际上开始注意get_project_settings()
的引入,这反过来在运行执行scrapy
的命令时感觉它已被加载。但不是真的装。
因此解决方案是将环境变量删除为
del os.environ['SCRAPY_SETTINGS_MODULE']
在调用子进程之前。
希望能帮助别人并节省时间。
谢谢