我是Python的新手,只是用scrapy写了一些蜘蛛。现在我想使用http请求激活我的蜘蛛,如下所示: http://xxxxx.com/myspidername/args
我使用nginx + uwsgi + django来调用我的scrapy蜘蛛。
步骤:
创建& config django项目
在django项目根目录中创建scrapy项目并编写我的蜘蛛
启动uwsgi:uwsgi -x django_socket.xml
在django app的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返回错误页面和错误日志显示“上游过早关闭连接,同时从上游读取响应头”,并且我可以看到 uwsgi 这个过程没有了,但是在uwsgi的日志中我可以看到我的蜘蛛正常运行。
我该如何解决此错误?
这样对吗?任何其他方式做我想要的?
答案 0 :(得分:1)
我不认为在django视图中启动蜘蛛工具是个好主意。 Django Web应用程序旨在为最终用户提供快速请求/响应,以便他们可以快速检索信息。即使我不完全确定导致错误发生的原因,我也会想象只要蜘蛛没有完成,你的视图功能就会卡在那里。
这里有两个选项可以尝试改善用户体验并最大限度地减少可能发生的错误:
crontab
它会定期运行您的脚本。您可以更轻松地进行日志记录和调试。但是它对于调度和缺乏控制并不灵活。
celery
这是一个非常python / Django特定工具,可以动态安排您的任务。您可以定义要定期运行的crontab任务,或者在运行时应用任务。它不会阻止您的视图功能并在单独的过程中执行所有操作,因此它很可能是您想要的。它需要一些设置,因此一开始可能并不简单。但是,很多人都使用过它,一旦一切就绪,它就会很好用。
答案 1 :(得分:0)
Nginx执行异步,非阻塞IO。
呼叫scrapy.cmdline
也是同步的。很可能这在nginx的背景下会混乱。
收到请求后尝试打开新流程。
有很多(也许不是很多)方法可以做到这一点。
首先尝试这个问题及其答案: Starting a separate process