【问题标题】:Scrapy + Django in production生产中的 Scrapy + Django
【发布时间】:2014-10-27 10:46:49
【问题描述】:

我正在编写一个使用 Scrapy 并且在本地运行良好的 Django 网络应用程序,但我想知道如何设置一个生产环境,让我的蜘蛛定期自动启动(我的意思是一旦蜘蛛完成它的工作它会在一段时间后重新启动……例如 24 小时后)。 目前我使用自定义 Django 命令启动我的蜘蛛,其主要目标是允许使用 Django 的 ORM 来存储抓取的项目,所以我运行:

python manage.py scrapy crawl myspider

结果存储在我的 Postgres 数据库中。 我安装了scrapyd,因为这似乎是在生产中运行scrapy的首选方式 但不幸的是,如果不编写猴子补丁(我想避免),我就无法使用它,因为它使用 JSON 作为其 Web 服务 API,并且我得到“modelX 不是 json 可序列化”异常。 我查看了django-dynamic-scraper,但它似乎不像 Scrapy 那样灵活和可定制,事实上他们在文档中说:

由于 DDS 简化了事情,因此 DDS 不适用于所有类型的 刮板,但它非常适合相对常见的情况 定期抓取包含更新项目列表的网站

我也想过使用 crontab 来安排我的蜘蛛...但是我应该在什么时间间隔运行我的蜘蛛?如果我的 EC2 实例(我将使用 amazon webservices 来托管我的代码)需要重新启动,我必须手动重新运行我所有的蜘蛛......嗯......事情变得复杂...... 那么......对于生产环境来说,什么是有效的设置?你如何处理它?你有什么建议?

【问题讨论】:

    标签: python json django scrapy scrapyd


    【解决方案1】:

    我有同样的问题,导致我在这里找到你的问题。以下是我的想法以及我对我的项目所做的事情。

    目前我使用自定义 Django 命令启动我的蜘蛛,该命令具有 主要目标是允许使用 Django 的 ORM 来存储抓取的 项目

    这听起来很有趣。我还想在 Scrapy 蜘蛛中使用 Django 的 ORM,所以我确实导入了 django 并在进行抓取之前对其进行了设置。如果你从已经实例化的 Django 上下文中调用 scrapy,我想这是不必要的。

    我安装了 scrapyd,因为它似乎是首选的运行方式 生产中的scrapy,但不幸的是我不写就无法使用它 猴子补丁(我想避免)

    我想到了使用 subprocess.Popen,将 stdout 和 stderr 重定向到 PIPE。然后获取 stdout 和 stderr 结果并处理它们。我不需要从输出中收集项目,因为蜘蛛已经通过管道将结果写入数据库。如果你以这种方式从 Django 调用 scrapy 进程,它会变得递归,并且 scrapy 进程会设置 Django 上下文以便它可以使用 ORM。

    然后我尝试了scrapyd,是的,您必须向scrapyd 发起HTTP 请求才能将作业排入队列,但它不会在作业完成或待处理时向您发出信号。那部分你必须检查,我猜那是猴子补丁的地方。

    我也想过使用 crontab 来安排我的蜘蛛...但是在什么时候 我应该运行我的蜘蛛吗?如果我的 EC2 实例(我要 使用亚马逊网络服务来托管我的代码)需要重新启动我必须 手动重新运行我所有的蜘蛛......嗯......事情变得复杂...... 那么......对于生产环境来说,什么是有效的设置? 你如何处理它?你有什么建议?

    我目前正在使用 cron 来安排抓取。这不是用户可以改变的东西,即使他们想要,但它也有它的优点。这样我可以确保用户不会缩短周期并让多个爬虫同时工作。

    我担心在链中引入不必要的链接。 Scrapyd 将是中间环节,看起来它现在正在做它的工作,但如果它不能承受生产负载,它也可能是薄弱环节。

    考虑到您刚刚发布了此内容,我很高兴听到您对整个 Django-Scrapy-Scrapyd 集成的解决方案。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-17
      • 2023-03-27
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 2016-02-28
      • 1970-01-01
      相关资源
      最近更新 更多