Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 刮痧+;生产中的Django_Python_Json_Django_Scrapy_Scrapyd - Fatal编程技术网

Python 刮痧+;生产中的Django

Python 刮痧+;生产中的Django,python,json,django,scrapy,scrapyd,Python,Json,Django,Scrapy,Scrapyd,我正在编写一个Django web应用程序,它利用了Scrapy,并且在本地运行得很好,但我想知道如何设置一个生产环境,在这个环境中,我的爬行器会定期自动启动(我的意思是,一旦爬行器完成工作,它会在一定时间后重新启动…例如24小时后)。 目前,我使用一个定制的Django命令启动spider,其主要目标是允许使用Django的ORM来存储刮取的项目,因此我运行: python manage.py scrapy crawl myspider 结果存储在我的Postgres数据库中。 我安装了,因

我正在编写一个Django web应用程序,它利用了Scrapy,并且在本地运行得很好,但我想知道如何设置一个生产环境,在这个环境中,我的爬行器会定期自动启动(我的意思是,一旦爬行器完成工作,它会在一定时间后重新启动…例如24小时后)。 目前,我使用一个定制的Django命令启动spider,其主要目标是允许使用Django的ORM来存储刮取的项目,因此我运行:

python manage.py scrapy crawl myspider
结果存储在我的Postgres数据库中。 我安装了,因为这似乎是生产中运行scrapy的首选方式 但不幸的是,我不能在不编写monkey补丁的情况下使用它(我希望避免),因为它的web服务API使用JSON,我得到“modelX不是JSON可序列化的”异常。 我看过了,但它的设计似乎不像Scrapy那样灵活和可定制,事实上,他们在文档中说:

由于它简化了事情,DDS不适用于所有类型的应用程序 刮刀,但它非常适合相对常见的 定期清理网站上的更新项目列表

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

我也有同样的问题,这让我想到了你的问题。以下是我对我的项目的想法和做法

目前,我使用定制的Django命令启动spider,该命令 主要目标是允许使用Django的ORM来存储刮取的数据 项目

这听起来很有趣。我还想在Scrapy Spider中使用Django的ORM,所以我确实导入了Django,并在刮擦发生之前进行了设置。如果从已经实例化的Django上下文调用scrapy,我想这是不必要的

我安装了scrapyd,因为它似乎是首选的运行方式 在制作过程中很粗糙,但不幸的是,我不能不写作就使用它 猴子补丁(我想避免)

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

然后我尝试了scrapyd,是的,您必须向scrapyd发出HTTP请求以使作业排队,但它不会在作业完成或挂起时向您发出信号。那部分你必须检查,我想那是一个猴子补丁的地方

我还想用crontab来安排我的蜘蛛。。。但是什么时候 我应该运行我的蜘蛛吗?如果我的EC2实例(我将 使用amazon Web服务托管我的代码)需要重新启动我必须 手动重新运行我所有的蜘蛛。。。嗯。。。事情变得复杂了。。。 所以生产环境的有效设置是什么? 你是怎么处理的?你有什么建议

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

我担心在链条中引入不必要的链接。Scrapyd将是中间环节,目前看来它正在做它的工作,但如果它不能保持生产负荷,它也可能是薄弱环节

考虑到您不久前发布了这篇文章,我很高兴听到您对整个Django-Scrapy-Scrapyd集成的解决方案

干杯