我正在使用scrapy和scrapyd来抓取一些内容。我有28个爬虫,但一次只有8个。每个爬虫需要10分钟到几个小时才能完成。因此,我正在寻找一种正确订购它们的方法,以便最大限度地缩短服务器处于活动状态的时间。
我已经收集了每次抓取所需时间的信息,因此它只是最小化问题,或者如何制定它。
脚本是使用php启动的,所以解决方案最好应该在php中运行。
答案 0 :(得分:0)
我发现的最好的方法是将它们设置为cronjobs以在特定时间执行。我有大约30个cronjobs配置为在不同时间启动,这意味着您可以设置每个废料的特定时间。
每天下午5点由cronjob执行PHP cmmand:
* 17 * * * php /opt/test.php
如果你通过cronjob执行scrapy python命令,那么:
* 17 * * * cd /opt/path1/ && scrapy crawl site1
如果你使用virtualenv为你的python然后它的
* 17 * * * source /opt/venv/bin/activate && cd /opt/path1/ && scrapy crawl site1
答案 1 :(得分:0)
很抱歉让您失望,但在您所描述的内容中没有任何聪明或任何最小化问题,因为您没有说明爬网作业之间的依赖关系。无论您如何订购,独立工作都需要〜TOTAL_TIME
/ THROUGHPUT
。
一旦完成,scrapyd将开始处理下一个工作。 “一次8个”不是某种桶事物,所以这里没有组合/动态编程问题。把所有28个工作扔给scrapyd并让它运行。当您轮询并发现它空闲时,您可以关闭服务器。
首先安排最长的工作可能会带来一些好处。在最后几个长工作完成后,您可以快速在空闲插槽上挤出一些小工作。但除非你处于某种不利的情况,否则这些好处不应该是主要的。
另请注意,此号码“8
” - 我猜是由max_proc_per_cpu
和/或max_proc
强制执行 - 有点武断。除非这是你达到100%CPU或其他东西的数字,否则更大的数字可能更适合。
如果你想获得重大利益,找到2-3个最大的工作,并找到一种方法将它们减少一半,例如如果你正在爬行一个站点,车辆将单个爬行分成两个,一个用于汽车,一个用于摩托车。这通常是可能的,并且比重新排序产生更大的益处。例如,如果您的较长作业为8小时,而下一个较长的作业为5,则通过将最长的作业分成两到4小时的爬行,您将使5小时的作业成为瓶颈,可能会使您的服务器节省3个小时。