【问题标题】:How to start my scrapy spider using http request?如何使用 http 请求启动我的爬虫?
【发布时间】:2016-01-28 14:05:08
【问题描述】:

我是 Python 新手,刚刚使用 scrapy 编写了一些蜘蛛。现在我想使用这样的http请求来激活我的蜘蛛: http://xxxxx.com/myspidername/args

我用 nginx + uwsgi + django 来调用我的scrapy spider。

步骤:

  1. 创建和配置 django 项目

  2. 在django项目根目录下创建scrapy项目并写我的spider

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

  4. 在 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
  • 酷,我会添加这个作为答案,以便其他人更快地找到它。

标签: python django scrapy


【解决方案1】:

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

这里有两个选项,您可以尝试改善用户体验并尽量减少可能发生的错误:

  1. crontab 它会定期运行您的脚本。它对您来说更可靠、更容易记录和调试。但调度不灵活,缺乏控制。

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

【讨论】:

    【解决方案2】:

    Nginx 进行异步、非阻塞 IO。

    scrapy.cmdline 的调用也是同步的。这很可能在 nginx 的上下文中搞砸了。

    在收到请求后尝试打开一个新进程。

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多