我正在编写一个使用Scrapy的Django网络应用程序,并且本地工作都非常好,但我想知道如何设置一个生产环境,我的蜘蛛定期自动启动(我的意思是蜘蛛完成工作后它会在一段时间后重新启动...例如24小时后。 目前我使用自定义Django命令启动我的蜘蛛,其主要目标是允许使用Django的ORM来存储被删除的项目,所以我运行:
python manage.py scrapy crawl myspider
,结果存储在我的Postgres数据库中。 我安装了scrapyd,因为它似乎是在生产中运行scrapy的首选方式 但不幸的是,如果没有编写猴子补丁(我想避免),我就无法使用它,因为它使用JSON作为其Web服务API,并且我得到“modelX不是json serializable”异常。 我看了django-dynamic-scraper,但似乎没有设计灵活和可定制的Scrapy,事实上他们说的是文档:
因为它简化了DDS不适用于所有类型的东西 刮刀,但它非常适合相对常见的情况 定期使用更新项目列表抓取网站
我还想过使用crontab来安排我的蜘蛛......但是我应该在什么时间间隔运行我的蜘蛛?如果我的EC2实例(我将使用amazon webservices来托管我的代码)需要重启我必须手动重新运行我的所有蜘蛛......嗯......事情变得复杂...... 那么......什么可以成为生产环境的有效设置?你怎么处理它?你的建议是什么?
答案 0 :(得分: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集成的解决方案。
干杯