Scrapy + Django正在制作中

时间:2014-10-27 10:46:50

标签: python json django scrapy scrapyd

我正在编写一个使用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来托管我的代码)需要重启我必须手动重新运行我的所有蜘蛛......嗯......事情变得复杂...... 那么......什么可以成为生产环境的有效设置?你怎么处理它?你的建议是什么?

1 个答案:

答案 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集成的解决方案。

干杯