0

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

python manage.py scrapy crawl myspider

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

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

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

4

1 回答 1

0

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

目前我使用自定义 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 实例(我将使用 amazon webservices 来托管我的代码)需要重新启动,我必须手动重新运行我的所有蜘蛛......嗯......事情变得复杂......所以......什么可以是生产环境的有效设置吗?你如何处理它?你有什么建议?

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

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

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

干杯

于 2015-02-20T16:16:08.733 回答