我使用scrapy和scrapyd来抓取一些内容。我有28个爬虫在运行,但一次只有8个。每个crawler需要10分钟到几个小时才能完成。因此,我正在寻找一种方法来正确地对它们进行排序,以便最大限度地减少服务器活动的时间。
我已经收集了每次爬行需要多长时间的信息,所以这只是最小化问题,或者如何制定它。
该脚本是使用php启动的,因此解决方案最好在php中运行。
发布于 2016-09-24 15:52:36
我发现最好的方法是将它们设置为在特定时间执行的cronjob。我有大约30个cronjob配置为在不同的时间启动,这意味着您可以设置每个碎片的特定时间。
每天下午5点由cronjob执行PHP命令:
* 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
发布于 2016-09-25 10:33:21
很抱歉让你失望了,但是在你的描述中没有任何聪明的东西,也没有任何最小化的问题,因为你没有说明爬行作业之间的依赖关系。无论您如何排序,独立作业都将占用~ TOTAL_TIME
/THROUGHPUT
。
scrapyd将在一个作业完成后立即开始处理下一个作业。“一次8个”不是某种桶的东西,所以这里不存在组合/动态编程问题。只需将所有28个作业抛给scrapyd并让其运行即可。当您轮询并发现它空闲时,您可以关闭您的服务器。
首先调度时间最长的作业可能会带来一些小小的好处。当最后几个长作业完成时,您可以快速地在空闲插槽上压缩几个小作业。但是,除非你是在一些不好的情况下,这些好处不应该是主要的。
还要注意,这个数字"8
“--我猜是由max_proc_per_cpu
和/或max_proc
强制执行的--有点随意。除非你达到了100%的CPU或其他的数字,也许更大的数字会更合适。
如果你想要更大的收益,找到2-3个最大的工作,并找到一种方法将它们一分为二,例如,如果你用车辆抓取一个网站,将单个抓取分为两个,一个是汽车抓取,一个是摩托车抓取。这通常是可能的,并且将产生比重新排序更显着的好处。例如,如果较长的作业是8小时,而下一个较长的作业是5小时,那么通过将最长的作业拆分为2-4小时的爬网,您将使5小时的作业成为瓶颈,可能会为服务器节省3个小时。
https://stackoverflow.com/questions/39673310
复制相似问题