如何使用http请求启动我的scrapy蜘蛛?

时间:2016-01-28 14:05:08

标签: python django scrapy

我是Python的新手,只是用scrapy写了一些蜘蛛。现在我想使用http请求激活我的蜘蛛,如下所示: http://xxxxx.com/myspidername/args

我使用nginx + uwsgi + django来调用我的scrapy蜘蛛。

步骤:

  1. 创建& config django项目

  2. 在django项目根目录中创建scrapy项目并编写我的蜘蛛

  3. 启动uwsgi:uwsgi -x django_socket.xml

  4. 在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")
    
  5. 当我访问指向索引视图的http://myhost/myapp/index时,nginx返回错误页面和错误日志显示“上游过早关闭连接,同时从上游读取响应头”,并且我可以看到 uwsgi 这个过程没有了,但是在uwsgi的日志中我可以看到我的蜘蛛正常运行。

    我该如何解决此错误?

    这样对吗?任何其他方式做我想要的?

2 个答案:

答案 0 :(得分:1)

我不认为在django视图中启动蜘蛛工具是个好主意。 Django Web应用程序旨在为最终用户提供快速请求/响应,以便他们可以快速检索信息。即使我不完全确定导致错误发生的原因,我也会想象只要蜘蛛没有完成,你的视图功能就会卡在那里。

这里有两个选项可以尝试改善用户体验并最大限度地减少可能发生的错误:

  1. crontab 它会定期运行您的脚本。您可以更轻松地进行日志记录和调试。但是它对于调度和缺乏控制并不灵活。

  2. celery 这是一个非常python / Django特定工具,可以动态安排您的任务。您可以定义要定期运行的crontab任务,或者在运行时应用任务。它不会阻止您的视图功能并在单独的过程中执行所有操作,因此它很可能是您想要的。它需要一些设置,因此一开始可能并不简单。但是,很多人都使用过它,一旦一切就绪,它就会很好用。

答案 1 :(得分:0)

Nginx执行异步,非阻塞IO。

呼叫scrapy.cmdline也是同步的。很可能这在nginx的背景下会混乱。

收到请求后尝试打开新流程。

有很多(也许不是很多)方法可以做到这一点。

首先尝试这个问题及其答案: Starting a separate process