【发布时间】:2016-01-28 14:05:08
【问题描述】:
我是 Python 新手,刚刚使用 scrapy 编写了一些蜘蛛。现在我想使用这样的http请求来激活我的蜘蛛: http://xxxxx.com/myspidername/args
我用 nginx + uwsgi + django 来调用我的scrapy spider。
步骤:
创建和配置 django 项目
在django项目根目录下创建scrapy项目并写我的spider
启动uwsgi:uwsgi -x django_socket.xml
-
在 django 应用的 views.py 中调用我的蜘蛛
from django.http import HttpResponse from scrapy import cmdline def index(request, mid): cmd = "scrapy crawl myitem -a mid=" + mid cmdline.execute(cmd.split()) return HttpResponse("Hello, it work")
当我访问指向索引视图的http://myhost/myapp/index时,nginx返回错误页面并且错误日志显示“upstream提前关闭连接同时从上游读取响应头”,我可以看到进程 uwsgi 消失了,但在 uwsgi 的日志中我可以看到我的蜘蛛运行正常。
我该如何解决这个错误?
这样对吗?还有其他方法可以做我想做的事吗?
【问题讨论】:
-
虽然我没有时间对此进行调查,但我会发布我的直观回复。 Nginx 是,afaik,一个异步服务器。这意味着您不能阻止等待输入。据我所知,
cmdline.execute东西阻塞了,所以这在 nginx 中可能天生就不可能。您应该尝试从该视图开始一个新过程。尝试使用subprocess模块(在 python 标准库中)。 stackoverflow.com/questions/3032805/starting-a-separate-process 尝试在新进程中打开scrapy spider。这意味着在另一个 shell 中调用scrapy可执行文件。 -
谢谢! subprocess 完成了这项工作!我使用 subprocess.Popen(cmd.split()) 现在没有错误。仍然有点困惑,我的请求时间似乎与我使用 subprocess.wait() 的天气差别不大。 @vlad-ardelean
-
酷,我会添加这个作为答案,以便其他人更快地找到它。